80 likes | 187 Views
Przeszukiwanie wszerz. BFS(G, s) 1 for każdy wierzchołek u V [ G ]-{ s } 10 do u := head [ Q ] 2 do color [ u ] := BIAŁY 11 for każdy v Adj [ u ] 3 d [ u ] := 12 do if color [ v ] = BIAŁY
E N D
Przeszukiwanie wszerz BFS(G, s) 1 for każdy wierzchołek uV[G]-{s} 10 dou := head[Q] 2 docolor[u] := BIAŁY 11 for każdy vAdj[u] 3 d[u] := 12 do ifcolor[v] = BIAŁY 4 [u] := NIL 13 then color[v] := SZARY 5 color[s] := SZARY 14 d[v] := d[u] + 1 6 d[s] := 0 15 [v] := u 7 [s] := NIL 16 ENQUEUE(Q, v) 8 Q := {s} 17 DEQUEUE(Q) 9 while Q 18 color[u] := CZARNY
1 2 3 1 2 3 1 2 3 2 2 0 1 0 0 1 5 5 6 6 4 6 4 4 5 2 2 2 1 1 1 2 3 1 2 3 1 2 3 2 1 2 0 0 0 1 1 5 5 5 6 6 6 4 4 4 2 2 1 2 1 1 2 Przykład przeszukiwania wszerz Q Q Q 5 3 4 1 4 6 1 2 2 0 2 2 Q Q Q 2 5 3 4 6 6 1 1 2 2 2 2
Przeszukiwanie w głąb DFS(G) DFS-Visit(u) 1 for każdy wierzchołek uV[G] 1 color[u] := SZARY 2 docolor[u] := BIAŁY 2 d[u] := time := time + 1 3 [u] := NIL 3 for każdy vAdj[u] 4 time := 0 4 do ifcolor[v] = BIAŁY 5 for każdy wierzchołek uV[G] 5 then [v] := u 6 do ifcolor[u] = BIAŁY 6 DFS-Visit(v) 7 then DFS-Visit(u) 7 color[u] := CZARNY 8 f[u] := time := time + 1
1 2 3 1 2 3 1 2 3 1/ 1/ 2/ 2/ 3/6 1/10 3/6 2/7 4 6 4 6 6 5 5 5 8/9 4/5 4/5 1 2 3 1 2 3 1 2 3 1/ 2/ 3/ 1/ 3/6 1/10 3/6 2/7 2/7 4 4 6 4 6 6 5 5 5 4/ 8/ 11/12 8/9 4/5 4/5 Przykład przeszukiwania w głąb 4
Sortowanie topologiczne Sortowanie topologiczne acyklicznego grafu skierowanego G = (V, E) polega na uporządkowaniu wszystkich jego wierzchołków w taki sposób, że jeśli graf G zawiera krawędź (u, v), to w tym porządku wierzchołek u występuje przed wierzchołkiem v. Topological-Sort (G) 1 wykonaj DFS(G) w celu obliczenia czasów przetworzenia f[v] dla wszystkich wierzchołków v. 2 wstaw każdy wierzchołek v na początek listy, kiedy tylko zostanie przetworzony. 3 return lista wierzchołków
1 2 3 1/10 3/6 2/7 4 6 5 11/12 8/9 4/5 2 4 1 5 3 6 8/9 11/12 1/10 2/7 3/6 4/5 Przykład sortowania topologicznego
Silnie spójne składowe Silnie spójną składową skierowanego grafu G = (V, E) jest maksymalny zbiór wierzchołków U V taki, że dla każdej pary wierzchołków u i v z U wierzchołki u i v są osiągalne jeden z drugiego. Strongly-Connected-Components (G) 1 wykonaj DFS(G) w celu obliczenia czasów przetworzenia f[u] dla wszystkich wierzchołków u. 2 oblicz GT 3 wykonaj DFS(GT), ale w głównej pętli procedury DFS rozważaj wierzchołki w kolejności malejących wartości f[u] (obliczonych w wierszu 1) 4 wypisz wierzchołki z każdego drzewa w lesie przeszukiwania w głąb z kroku 3 jako oddzielną silnie spójną składową
d c a b 8/9 13/14 11/16 1/10 3/4 2/7 5/6 12/15 h e f g d c a b cd abe h fg h e f g Silnie spójne składowe, przykład