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 .
Kód
01.
index =
0
02.
03.
/*
04.
* Spousti tarjanuv algoritmus
05.
* @param g graf, v nemz budou hledany silne komponenty
06.
* @return seznam komponent
07.
*/
08.
List executeTarjan(Graph g)
09.
Stack s = {}
10.
List scc = {}
//seznam silnych komponent
11.
for
Node node in g
12.
if
(v.index is undefined)
13.
tarjanAlgorithm(node, scc, s)
14.
15.
return
scc
16.
17.
/*
18.
* Tarjanuv algoritmus
19.
* @param node zpracovavany uzel
20.
* @param SCC seznam komponent (seznamu uzlu v komponentach)
21.
* @param s zasobnik
22.
*/
23.
procedure tarjanAlgorithm(Node node, List scc, Stack s)
24.
v.index = index
25.
v.lowlink = index
26.
index++
27.
s.push(node)
//pridej na zasobnik
28.
for
each Node n in Adj(node)
do
//pro vsechny potomky
29.
if
n.index == -
1
//pokud jeste nebyl uzel objeven
30.
tarjanAlgorithm(n, scc, s, index)
//prohledej
31.
node.lowlink = min(node.lowlink, n.lowlink)
//uprav lowlink otce
32.
else
if
stack.contains(n)
//pokud komponenta nebyla jiz uzavrena
33.
node.lowlink = min(node.lowlink, n.index)
34.
35.
if
node.lowlink == node.index
//pokud jsme v koreni komponenty
36.
Node n =
null
37.
List component
//seznam uzlu dane komponenty
38.
do
39.
n = stack.pop()
//vyber uzel ze zasobniku
40.
component.add(n)
//pridej ho do komponenty
41.
while
(n != v)
//dokud nejsme v koreni
42.
scc.add(component)
//komponentu pridej do seznamu komponent