Skierowane grafy acykliczne

by Jerry Sky



Fakt\text {Fakt} #1

Graf skierowany posiada cykl iff gdy podczas wykonywania procedury DFS zostanie wykryta back edge

Szkic d-d Faktu\text {Faktu}

Jeśli \exists back edge     \implies graf skierowany posiada cykl; jeśli (u,v)(u,v) jest typu back edge, wówczas mamy cykl zawierający krawędź (u,v)(u,v) oraz krawędzie występujące pomiędzy vv i uu w drzewie DFS

Graf skierowany posiada cykl
C:v0v1vkv0    C: v_0 \to v_1 \to \dotsb \to v_k \to v_0 \implies back edge: znajdźmy wierzchołek należący do tego cyklu (powiedzmy viv_i), który został jako pierwszy odkryty podczas wykonywania procedury DFS (czyli wartość vi.prev_i.\mathrm{pre} jest mniejsza od wszystkich innych wartości vj.prev_j.\mathrm{pre} dla wierzchołków vjv_j należących do tego cyklu). Wszystkie inne wierzchołki vjv_j należące do tego cyklu będą potomkami wierzchołka viv_i w drzewie DFS. Wśród potomków będzie również wierzchołek vi1v_{i-1} (lub vkv_k jeśli i=0i=0) z którego można dojść do viv_i (ponieważ vi1viCv_{i-1} \to v_i \in C) i krawędź (vi1,vi)E(v_{i-1}, v_i) \in E jest z definicji back edge.

Zatem wykonując DFS możemy wykrywać czy skierowany graf ma cykl wykrywając krawędź typu back edge.

Linearyzacja DAGa (sortowanie topologiczne)

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.

Fakt\text {Fakt} #2

W skierowanym grafie acyklicznym dla każdej krawędzi (u,v)E(u,v) \in E zachodzi u.post>v.postu.\mathrm{post} > v.\mathrm{post}.

linearizeDAG(G)(G)

Powyższy fakt daje łatwy przepis na algorytm zwracający interesujący nas porządek wierzchołków w DAGu:

linearizeDAG(G)(G):

  1. Wykonaj DFS uzupełniając wartości post\mathrm{post} w procedurze postvisit
  2. return porządek wierzchołków od największej wartości post\mathrm{post} do najmniejszej

Example of linearizeDAG

example

Strongly connected components

Spójność grafu skierowanego definiujemy przy użyciu następującej relacji:

Wierzchołki uu oraz vv należące do GG skierowanego są połączone jeśli istnieje ścieżka od uu do vv oraz ścieżka od vv do uu.

Relacja ta dzieli zbiór wierzchołków VV 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.

Własności

Własność #1

Procedura explore rozpoczęta w wierzchołku uVu \in V zakończy się gdy wszystkie wierzchołki, do których można dojść z uu, 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:

Własność #2

Wierzchołek mający największą wartość post\mathrm{post} 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 GG 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 GRG^R, w którym odwrócimy kierunki wszystkich krawędzi to DFS zwróci nam największą wartość post\mathrm{post} dla wierzchołka należącego do źródła GRG^R, a z relacji pomiędzy grafami GG i GRG^R wiemy, że źródło meta-grafu stworzonego z GRG^R jest ujściem meta-grafu stworzonego z GG. 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 GG.

Własność #3

Niech CC i CC' będą składowymi silnie spójnymi grafu G=(V,E)G = (V,E) oraz niech istnieje krawędź (u,v)E(u,v) \in E taka, że uCu\in C, a vCv \in C', wtedy największa wartość post\mathrm{post} spośród wierzchołków należących do CC jest większa niż największa wartość post\mathrm{post} spośród wierzchołków należących do CC' (czyli max{x.post:xC}>max{y.post:yC}\max\{x.\mathrm{post}: x\in C\} > \max\{y.\mathrm{post}: y \in C'\}).

Szkic dowodu:
Jeśli spośród wierzchołków należących do CC i CC' pierwszy odwiedzony będzie uCu\in C wtedy z własności 1 wiemy, że procedura explore(u)(u) nada wartość u.postu.\mathrm{post} po odwiedzeniu wszystkich innych wierzchołków należących do CC i CC' będzie miał wierzchołek uCu \in C.
Jeśli spośród wierzchołków należących do CC i CC' pierwszy odwiedzony będzie wierzchołek vCv \in C' to najpierw odwiedzimy wszystkie inne należące do CC' i procedura explore(v)(v) zakończy działania. Następnie DFS wykona procedurę explore(u)(u) na wierzchołku uCu \in C i odwiedzi wszystkie inne wierzchołki należące do CC. Stąd wierzchołki należące do CC będą miały większe wartości post\mathrm{post} od wierzchołków należących do CC'.

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 post\mathrm{post} 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 GG i rozpocząć znajdowanie kolejnej składowej silnie spójnej od wierzchołka z największą wartością post\mathrm{post} spośród wierzchołków, które nie zostały usunięte z grafu GG.

FindStronglyConnectedComponents(G)(G)

Teraz możemy określić algorytm znajdujący silnie połączone składowe grafu:

FindStronglyConnectedComponents(G)(G):

  1. Wykonaj DFS na grafie GRG^R zapisując wartości post\mathrm{post} dla węzłów
  2. Wykonaj algorytm sprawdzania spójności grafu (wersja dla grafu nieskierowanego) na grafie GG przy użyciu procedury DFS używając przy tym kolejności malejącej wartości post\mathrm{post} wyznaczone wyżej

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 O(V+E)O(|V| + |E|).

Przykład

example

More