linearizeDAG
FindStronglyConnectedComponents
Graf skierowany posiada cykl iff gdy podczas wykonywania procedury DFS zostanie wykryta back edge
Jeśli back edge graf skierowany posiada cykl; jeśli jest typu back edge, wówczas mamy cykl zawierający krawędź oraz krawędzie występujące pomiędzy i w drzewie DFS
Graf skierowany posiada cykl
back edge: znajdźmy wierzchołek należący do tego cyklu (powiedzmy ), który został jako pierwszy odkryty podczas wykonywania procedury DFS (czyli wartość jest mniejsza od wszystkich innych wartości dla wierzchołków należących do tego cyklu). Wszystkie inne wierzchołki należące do tego cyklu będą potomkami wierzchołka w drzewie DFS. Wśród potomków będzie również wierzchołek (lub jeśli ) z którego można dojść do (ponieważ ) i krawędź jest z definicji back edge.
Zatem wykonując DFS możemy wykrywać czy skierowany graf ma cykl wykrywając krawędź typu back edge.
Wierzchołki skierowanego grafu acyklicznego można uporządkować w taki sposób, że wszystkie krawędzie grafu będą skierowane od wierzchołków będących wcześniej w porządku do wierzchołków będących później w tym porządku.
Jest to jedna z pierwszych rzeczy, które należy wykonać m.in. podczas realizacji metodologii programowania dynamicznego.
W skierowanym grafie acyklicznym dla każdej krawędzi zachodzi .
linearizeDAG
Powyższy fakt daje łatwy przepis na algorytm zwracający interesujący nas porządek wierzchołków w DAGu:
linearizeDAG
:
postvisit
return
porządek wierzchołków od największej wartości do najmniejszejlinearizeDAG
Spójność grafu skierowanego definiujemy przy użyciu następującej relacji:
Wierzchołki oraz należące do skierowanego są połączone jeśli istnieje ścieżka od do oraz ścieżka od do .
Relacja ta dzieli zbiór wierzchołków na rozłączne podzbiory, gdzie w każdym podzbiorze występują wierzchołki, które są ze sobą połączone. Podzbiory te nazywamy składowymi silnie spójnymi i tworzą one meta-graf będący skierowanym grafem acyklicznym.
Procedura explore
rozpoczęta w wierzchołku zakończy się gdy wszystkie wierzchołki, do których można dojść z , zostaną odwiedzone.
Własność ta mówi nam, że jeśli wykonamy procedurę explore
w wierzchołku należącym do składowej będącej ujściem (wierzchołkiem, z którego już nigdzie nie można przejść) w meta-grafie to przejdziemy przez wszystkie wierzchołki należące do tej składowej. Sugeruje to nam w jaki sposób możemy znajdować silnie spójne składowe, ale zostają jeszcze dwa nierozwiązane problemy:
Wierzchołek mający największą wartość po wykonaniu procedury DFS musi leżeć w źródle (czyli wierzchołku do którego nie wchodzą żadne krawędzie) meta-grafu skłądowych silnie spójnych.
Własność ta wynika z własności #3, która będzie dowiedziona w następnym punkcie. Własność ta pozwala nam zidentyfikować wierzchołek grafu należący do źródła meta-grafu składowych silnie spójnych, czyli odwrotności ujścia, na którym nam zależy. Zatem jeśli rozważymy graf , w którym odwrócimy kierunki wszystkich krawędzi to DFS zwróci nam największą wartość dla wierzchołka należącego do źródła , a z relacji pomiędzy grafami i wiemy, że źródło meta-grafu stworzonego z jest ujściem meta-grafu stworzonego z . To rozwiązuje nam problem pierwszy z własności #1 znalezienia wierzchołka należącego do ujścia meta-grafu składowych silnie spójnych grafu .
Niech i będą składowymi silnie spójnymi grafu oraz niech istnieje krawędź taka, że , a , wtedy największa wartość spośród wierzchołków należących do jest większa niż największa wartość spośród wierzchołków należących do (czyli ).
Szkic dowodu:
Jeśli spośród wierzchołków należących do i pierwszy odwiedzony będzie wtedy z własności 1 wiemy, że procedura explore
nada wartość po odwiedzeniu wszystkich innych wierzchołków należących do i będzie miał wierzchołek .
Jeśli spośród wierzchołków należących do i pierwszy odwiedzony będzie wierzchołek to najpierw odwiedzimy wszystkie inne należące do i procedura explore
zakończy działania. Następnie DFS wykona procedurę explore
na wierzchołku i odwiedzi wszystkie inne wierzchołki należące do . Stąd wierzchołki należące do będą miały większe wartości od wierzchołków należących do .
Własność 3 można odczytać również jako:
składowe silnie spójne meta-grafu mogą zostać uporządkowane (linearyzowane) w kolejności malejącej po największych wartościach wierzchołków należących do tych składowych. Własność 3 pozwala nam na rozwiązanie problemu drugiego z własności 1: po znalezieniu i eksploracji śladowej silnie spójnej będącej ujściem w meta-grafie możemy usunąć należące do niej wierzchołki grafu i rozpocząć znajdowanie kolejnej składowej silnie spójnej od wierzchołka z największą wartością spośród wierzchołków, które nie zostały usunięte z grafu .
FindStronglyConnectedComponents
Teraz możemy określić algorytm znajdujący silnie połączone składowe grafu:
FindStronglyConnectedComponents
:
Złożoność obliczeniowa:
Algorytm wyznaczania składowych silnie spójnych polega na dwukrotnym wykonaniu procedury DFS, która działa w czasie liniowym. Zatem złożoność obliczeniowa algorytmu wyznaczania składowych silnie spójnych to .