Tarjanův algoritmus

Tarjanův algoritmus (Tarjan's algorithm) je grafový algoritmus sloužící k vyhledávání silných komponent orientovaného grafu. Silná komponenta je maximální množina uzlů orientovaného grafu taková, že mezi každými dvěma uzly existuje sled.

Princip

Tarjanův algoritmus vychází z prohledávání do hloubky. Vrcholy se při prohledávání indexují dle pořadí svého nalezení. Při návratu z rekurze se každému vrcholu přiřadí uzel s nejnižším indexem na jaký lze dosáhnout. Všechny vrcholy, které mají totožný cílový uzel (index), jsou ve stejné komponentě.

Složitost

Tarjanův algoritmus má stejně jako prohledávání do hloubky asymptotickou složitost O(\vert U \vert + \vert H \vert).

Kód

   /*
    * Tarjanuv algoritmus
    * @param node zpracovavany uzel
    * @param SCC seznam komponent (seznamu uzlu v komponentach)
    * @param s zasobnik
    * @param index index slouzici k cislovani uzlu
    * @return seznam komponent 
    */
   List tarjanAlgorithm(Node node, List scc, Stack s, int index)
       v.index = index
       v.lowlink = index
       index++
       s.push(node) //pridej na zasobnik
       for each Node n in Adj(node) do //pro vsechny sousedy
           if n.index == -1 //pokud jeste nebyl uzel objeven
               tarjanAlgorithm(n, scc, s, index) //prohledej
               node.lowlink = min(node.lowlink, n.lowlink) //uprav lowlink otce
           else if stack.contains(n)
               node.lowlink = min(node.lowlink, n.index)
           
       if node.lowlink == node.index //pokud jsme v koreni komponenty
           Node n = null
           List component //seznam uzlu dane komponenty
           do
               n = stack.pop() //vyber uzel ze zasobniku
               component.add(n) //pridej ho do komponenty
           while(n != v) //dokud nejsme v koreni
           scc.add(component) //komponentu pridej do seznamu komponent
       return scc //vrat seznam komponent
{ zpětná vazba }
Delicious Delicious
Sdílet
Hodnocení (2): 5

Přečtěte si také

Diskuse





Pavel Mička18.6.2010
Díky za korekturu, tady jsem to trochu přeformuloval, ostatní věci jsem také opravil.
bubersson18.6.2010
chybka: "nejnižší indexu uzlu" chybí asi "číslo" ;)