Algorytmy grafowe (AGR 320) semestr letni 2004/2005 Michał Karoński Wydział Matematyki i Informatyki UAM Algorytmy grafowe (AGR 320) p. 1/9
1. Rodzaje grafów grafy proste multigrafy grafy skierowane (digrafy) grafy ważone hipergrafy Algorytmy grafowe (AGR 320) p. 2/9
2. Reprezentacje grafów 2.1 Macierz przyległości (sasiedztwa) Definicja (Macierz przyległości). Dany jest graf G = (V, E), przy czym V = {v 1,v 2,...,v n } jest zbiorem wierzchołków, to n n macierz A(G) = (a ij ), gdzie a ij jest liczba krawędzi łacz acych wierzchołki v i oraz v j nazywa się macierza przyległości grafu G. W przypadku grafu skierowanego a ij jest liczba łuków z wierzchołka v i do v j. Algorytmy grafowe (AGR 320) p. 3/9
v 3 v 1 v 2 Rysunek 1: Przykład grafu prostego G = (V,E), gdzie V = {v 1,v 2,v 3,v 4,v 5 },E = {e 1,e 2,e 3,e 4,e 5,e 6,e 7 }, e 1 = v 1 v 2,e 2 = v 2 v 3,e 3 = v 2 v 5,e 4 = v 3 v 4,e 5 = v 2 v 4,e 6 = v 4 v 6,e 7 = v 1 v 4. v 5 v 4 Algorytmy grafowe (AGR 320) p. 4/9
Przykład. Macierz przyległości dla grafu przedstawionego na Rysunku 1. A(G) = v 1 v 2 v 3 v 4 v 5 v 1 0 1 0 1 0 v 2 1 0 1 1 1 v 3 0 1 0 1 0 v 4 1 1 1 0 1 v 5 0 1 0 1 0 = 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 0. Algorytmy grafowe (AGR 320) p. 5/9
macierz przyległości (sasiedztwa) A(G) jest macierza binarna (dla grafu prostego) macierz przyległości wymaga V 2 = n 2 bitów pamięci jeżeli w jest długościa słowa maszynowego, to każdy wiersz macierzy przyległości można zapisać jako ciag n bitów w n/w słowach maszynowych ( x oznacza najmniejsza liczbę całkowita nie mniejsza niż x) graf prosty: A(G) jest symetryczna - n(n 1)/2 bitów graf skierowany: n n/w reprezentacja macierzowa jest korzystniejsza dla grafów gęstych Algorytmy grafowe (AGR 320) p. 6/9
2.2 Macierz incydencji Definicja (Macierz incydencji). Dany jest graf G = (V, E), przy czym V = {v 1,v 2,...,v n } jest zbiorem wierzchołków natomiast E = {e 1,e 2,...,e m } zbiorem krawędzie grafu, to macierz M(G) = (m ij )1, 1 i n, 1 j m, gdzie liczba m ij {0, 1, 2} oznacza ile razy v i oraz e j s a incydentne ( 2 występuje w przypadku pętli), jest macierza incydencji grafu G. Algorytmy grafowe (AGR 320) p. 7/9
e 7 v 3 e 4 e 6 e 5 e 2 e 3 v 1 e 1 v 2 v 5 v 4 Algorytmy grafowe (AGR 320) p. 8/9
Przykład. Macierz incydencji dla grafu przedstawionego na Rysunku 1. G = (V,E): V = 5, E = 7, V = {v 1, v 2, v 3, v 4, v 5 }, E = {e 1, e 2, e 3, e 4, e 5, e 6, e 7 }, e 1 = v 1 v 2, e 2 = v 2 v 3, e 3 = v 2 v 5, e 4 = v 3 v 4, e 5 = v 2 v 4, e 6 = v 4 v 5, e 7 = v 1 v 4. M(G) = e 1 e 2 e 3 e 4 e 5 e 6 e 7 v 1 1 0 0 0 0 0 1 v 2 1 1 1 0 1 0 0 v 3 0 1 0 1 0 0 0 v 4 0 0 0 1 1 1 1 v 5 0 0 1 0 0 1 0 Algorytmy grafowe (AGR 320) p. 9/9
Macierz incydencji wymaga V E bitów pamięci, co może być liczba większa niż V 2 bitów zajmowanych przez macierz przyległości, ponieważ liczba krawędzi E jest często większa niż liczba wierzchołków V. W niektórych jednak przypadkach może być korzystniejsze użycie macierzy incydencji, niż macierzy przyległości pomimo zwiększonej zajętości pamięci. Macierze incydencji sa szczególnie dogodne przy rozpatrywaniu obwodów elektrycznych i układów przełaczaj acych. Algorytmy grafowe (AGR 320) p. 10/9
2.3 Lista krawędzi Innym, często stosowanym sposobem reprezentacji grafu jest wypisanie wszystkich jego krawędzi jako par wierzchołków. Tak na przykład, graf z Rysunku 1 byłby przedstawiony jako lista następujacych nieuporzadkowanych par: (v 1,v 2 ), {v 1,v 4 }, {v 2,v 3 }, {v 2,v 4 }, {v 2,v 5 }, {v 3,v 4 }, {v 4,v 5 }. Dla grafu skierowanego, były by to uporzadkowane pary wierzchołków odpowiadajace łukom. Algorytmy grafowe (AGR 320) p. 11/9
liczba bitów potrzebna do zaetykietowania (etykietami od 1 do n) wierzchołków grafu G jest równa b, gdzie 2 b 1 < n 2 b, czyli b = log 2 n + 1 całkowita zajętość pamięci jest równa 2 E b bitów ten sposób reprezentacji jest bardziej ekonomiczny niż macierz przyległości, jeżeli 2 E b < V 2 reprezentacja listowa" jest korzystniejsza dla grafów rzadkich przechowywanie i przekształcanie grafu w komputerze jest trudniejsze (na przykład przy badaniu spójności grafu) Algorytmy grafowe (AGR 320) p. 12/9
2.4 Dwie tablice liniowe modyfikacja listy krawędzi - przedstawienie grafu za pomoca dwóch tablic liniowych: F = (f 1,f 2,...,f e ), H = (h 1,h 2,...,h e ). elementy tablic: etykiety wierzchołków, e = E G graf skierowany: i-ty łuk, e i, prowadzi od wierzchołka f i, do wierzchołka h i G graf nieskierowany: krawędź e i łaczy f i i h i. dogodna reprezentacja do sortowania w grafach ważonych Algorytmy grafowe (AGR 320) p. 13/9
Przykład. Dwie tablice liniowe dla grafu przedstawionego na Rysunku 1. e 7 v 3 e 4 e 6 e 5 e 2 e 3 v 1 e 1 v 2 v 5 v 4 F = (v 1,v 2,v 2,v 3,v 2,v 4,v 1 ), H = (v 2,v 3,v 5,v 4,v 4,v 5,v 4 ). Algorytmy grafowe (AGR 320) p. 14/9
2.5 Lista wierzchołków sasiednich (następników) efektywna metoda reprezentacji grafów stosowana w przypadku gdy stosunek E / V nie jest duży dla każdego wierzchołka v tworzymy listę (tablicę), której pierwszym elementem jest v; a pozostałymi elementami sa: wierzchołki będace sasiadami wierzchołka v (w przypadku grafu nieskierowanego) bezpośredni następnicy wierzchołka v, tzn. wierzchołki, do których istnieje łuk z wierzchołka v (w przypadku grafu skierowanego) Algorytmy grafowe (AGR 320) p. 15/9
v 3 v 1 v 2 v 5 v 4 v 1 : v 2, v 4 v 2 : v 1, v 3, v 4, v 5 v 3 : v 2, v 4 v 4 : v 1, v 2, v 3, v 5 v 5 : v 2, v 4 Algorytmy grafowe (AGR 320) p. 16/9
1 2 5 3 4 6 1 2 3 2 1 3 4 6 3 4 1 2 2 3 4 5 5 4 6 6 2 5 Algorytmy grafowe (AGR 320) p. 17/9
1 2 5 3 4 6 1 2 3 4 5 6 2 4 6 1 2 4 5 6 6 Algorytmy grafowe (AGR 320) p. 18/9
3. Przeszukiwanie grafów Znajdujac się w pewnym wierzchołku v przeszukujemy wszystkie krawędzie incydentne do v, a następnie poruszamy się do pewnego wierzchołka przyległego w. W wierzchołku w przeszukujemy wszystkie krawędzie incydentne do w. Ten proces prowadzi się dotad, aż przeszuka się wszystkie wierzchołki w grafie. Metodę tę nazywa się przeszukiwaniem wszerz (ang. breadth-first search, często oznaczane skrótowo BFS). Algorytmy grafowe (AGR 320) p. 19/9
zamiast przeszukiwać każda krawędź incydentna do wierzchołka v, poruszamy się do pewnego wierzchołka przyległego w (wierzchołka, w którym dotychczas jeszcze nie byliśmy), gdy tylko to jest możliwe, pozostawiajac na razie wierzchołek v z być może niezbadanymi krawędziami. Inaczej mówiac, podażamy przez graf ścieżka przechodzac do nowego wierzchołka, gdy tylko to jest możliwe. Taka metoda przeszukiwania grafu, zwana przeszukiwaniem w głab (ang. depth-first search, w skrócie DFS) lub metoda powrotu po tej samej ścieżce na grafie. upraszcza wiele algorytmów teorii grafów, ze względu na otrzymywane ponumerowanie wierzchołków i skierowanie krawędzi. Algorytmy grafowe (AGR 320) p. 20/9
3.1 Przeszukiwanie grafu wszerz (BFS) G = (V, E) - graf nieskierowanym reprezentowanym w postaci listy wierzchołków sasiednich. x - ustalony wierzchołek z którego należy rozpoczać przeszukiwanie grafu I v - tablica zawierajaca wierzchołki incydentne z v NI v liczba elementów w I v Algorytmy grafowe (AGR 320) p. 21/9
1. Ustaw: Numer[x] 1, Drzewo, Pozostale ; dopisz x do Kolejki. 2. Jeżeli Kolejka jest pusta to STOP. 3. Pobierz element z Kolejki i zapisz go jako v. 4. Dla każdego wierzchołka w incydentnego do v wykonaj: (a) Jeżeli Numer[w] = 0, tzn. wierzchołek w odwiedzamy po raz pierwszy, to nadaj wierzchołkowi w kolejny numer, dopisz w do Kolejki, a krawędź vw dodaj do Drzewo. (b) Jeżeli Numer[w] 0, tzn. wierzchołek w już był odwiedzany, natomiast krawędź vw / Drzewo to dodaj ja do zbioru Pozostale. 5. Wróć do kroku 2. Algorytmy grafowe (AGR 320) p. 22/9
(G, x) Numer[x] Ponumerowano 1 NKolejka 1; Kolejka[NKolejka] x NKolejka > 0 v Kolejka[1] NKolejka NKolejka 1 i 1 NKolejka Kolejka[i] Kolejka[i + 1] i 1 NIv w Iv[i] Numer[w] = 0 Ponumerowano Ponumerowano + 1 N umer[w] P onumerowano Drzewo Drzewo {vw} NKolejka NKolejka + 1 Kolejka[N Kolejka] w!numer, Drzewo, {vw} Algorytmy grafowe (AGR 320) p. 23/9
' () & % "#$ G, x 2 1 0 / -. +, +, * 3 N umer, Drzewo, Numer[x] Ponumerowano 1 NKolejka 1; Kolejka[NKolejka] x NKolejka > 0 v Kolejka[1] NKolejka NKolejka 1 i 1 NKolejka Kolejka[i] Kolejka[i + 1] i 1 NI v w I v [i] Numer[w] = 0 Ponumerowano Ponumerowano + 1 N umer[w] P onumerowano Drzewo Drzewo {vw} NKolejka NKolejka + 1 Kolejka[N Kolejka] w {vw} (N umer, Drzewo, ) # 4 5 # % $ )'#B A D % ( N&L &B G %& G %& D % D % ' G ( % ( % L )B ( #M B B 6 7879 6 7879 <= :; 6 7879 <= :; <= :; 6 7879 <= :; 3 2 > 3 2? 3 2 @ 3 2 C 3 2 E 3 2 F 3 2 H 3 2 I 3 2 J 3 2 >K 3 2 >> 3 2 >? 3 2 >@ 3 2 >C 3 2 >E 3 3 2 >F 2 >H 3 2 >I Algorytmy grafowe (AGR 320) p. 24/9
Przykład. Przeszukiwanie grafu wszerz OP QRS T UVW G,x ]^ \ [ XZ XY _ q v wx tu r s tz y s N umer, Drzewo, Numer[x] Ponumerow 1 NKolejka 1; Kolejka[NKolejka] x P PQ Rà VTP knkolejka > 0 j h fg i b cdce v Kolejka[1] NKolejka NKolejka 1 m RSi 1 U RNKolejka a = 1 Sk l R l RKolejka[i] Kolejka[i + 1] m RSi 1 w I v [i] Numer[w] = 0 Ponumerow Ponumerow + 1 Numer[w] Ponumerow Drzewo Drzewo {vw} NKolejka NKolejka + 1 Kolejka[N Kolejka] w l R U RNIv T m V U kn f okbcdce g Pk U psn(numer,drzewo, h i h fg b cdce i) b cdce fg h i {vw} b c d e f g Numer[a] 1 Ponumerow 1 Kolejka a NKolejka 1 Algorytmy grafowe (AGR 320) p. 25/9
{ }~ ƒ G,x Š ˆ ž Ÿ «ª a N umer, Drzewo, Numer[x] Ponumerow 1 NKolejka 1; Kolejka[NKolejka] x Œ } ~ NKolejka > 0 ~ Ž v Kolejka[1] NKolejka NKolejka 1 ~i 1 ~NKolejka ~Kolejka[i] Kolejka[i + 1] ~i 1 w I v [i] Numer[w] = 0 Ponumerow Ponumerow + 1 Numer[w] Ponumerow Drzewo Drzewo {vw} NKolejka NKolejka + 1 Kolejka[N Kolejka] w ~ ~NIv š Ž Ž {vw} a = 1 b = 2 c = 3 d e f g v a Kolejka NKolejka 0 œš(numer,drzewo, ) Ž w b Ponumerow 2 Numer[b] 2 Drzewo {ab} Kolejka b NKolejka 1 w c Ponumerow 3 Numer[c] 3 Drzewo {ab,ac} Kolejka b,c NKolejka 2 Algorytmy grafowe (AGR 320) p. 26/9
G,x º» ¹ µ µ ²³ ± ¼ Î Ü Û Ù Ú Ø ÓÖ Ô Õ Ñ ÓÔ Ò Ï ÐÑ Ñb N umer, Drzewo, Numer[x] Ponumerow 1 NKolejka 1; Kolejka[NKolejka] x ½ ¾ ³± ÈNKolejka > 0 Ç È É É ± Ê ³ ² ÈË Å ÃÄ Æ ÀÁÀ v Kolejka[1] NKolejka NKolejka 1 Ê i 1 ² NKolejka É Kolejka[i] Kolejka[i + 1] Ê i 1 ² NIv w I v [i] Numer[w] = 0 Ponumerow Ponumerow + 1 Numer[w] Ponumerow Drzewo Drzewo {vw} NKolejka NKolejka + 1 Kolejka[N Kolejka] w à ÌÈ ÀÁÀÂ Ä È ² Í Ë(Numer,Drzewo, Å Æ Å ÃÄ ÀÁÀ Æ) ÀÁÀ ÃÄ Å Æ {vw} a = 1 b = 2 c = 3 d = 4 e = 5 f g v b Kolejka c NKolejka 1 w a w c w d Ponumerow 4 Numer[d] 4 Drzewo {ab,ac, Kolejka c,d NKolejka 2 w e Ponumerow 5 Numer[e] 5 Drzewo {ab,ac,bd Kolejka c,d,e NKolejka 3 w f Ponumerow 6 Numer[f] 6 Drzewo {ab,ac,bd, Kolejka c,d,e,f NKolejka 4 Algorytmy grafowe (AGR 320) p. 27/9
ÝÞ ßàá â ãäå G,x ëì ê é æè æç í ÿ c N umer, Drzewo, Numer[x] Ponumerow 1 NKolejka 1; Kolejka[NKolejka] x ß ø Þ î Þ à ï äâþ ùnkolejka > 0 ö ôõ ð ñòñó v Kolejka[1] NKolejka NKolejka 1 ànkolejka àkolejka[i] Kolejka[i + 1] ã ú û àái 1 a = 1 b = 2 c = 3 áù ú à û àái 1 w I v [i] Numer[w] = 0 Ponumerow Ponumerow + 1 Numer[w] Ponumerow Drzewo Drzewo {vw} NKolejka NKolejka + 1 Kolejka[N Kolejka] w ú à ã àniv â û ä ã ùü ô ýùðñòñó õ Þù ã þáü(numer,drzewo, ö ö ôõ ð ñòñó ) ð ñòñó ôõ ö {vw} d = 4 e = 5 f = 6 g = 7 v c Kolejka d,e,f NKolejka 3 w a w b w f w g Ponumerow 7 Numer[g] 7 Drzewo {ab,ac,bd,be,bf,cg} Kolejka d,e,f,g NKolejka 4 Algorytmy grafowe (AGR 320) p. 28/9
G,x 0 > = ; < : 96 58 7 3 56 4 1 23 3d N umer, Drzewo, Numer[x] Ponumerow 1 NKolejka 1; Kolejka[NKolejka] x ) *NKolejka > 0! "#"$ ' ( %& v Kolejka[1] NKolejka NKolejka 1 NKolejka Kolejka[i] Kolejka[i + 1] +, i 1 a = 1 b = 2 c = 3 * +, i 1 w I v [i] Numer[w] = 0 Ponumerow Ponumerow + 1 Numer[w] Ponumerow Drzewo Drzewo {vw} NKolejka NKolejka + 1 Kolejka[N Kolejka] w + NIv, *- %.*!"#"$ & * /-(Numer,Drzewo,! "#"$ ' ' %& ( ()! "#"$ ' %& ( {vw} d = 4 e = 5 f = 6 g = 7 v d Kolejka e,f,g NKolejka 3 w b w e Algorytmy grafowe (AGR 320) p. 29/9
?@ ABC D EFG G,x MN L K H J HI O a o n l m k jg fi h d fg e b cd de N umer, Drzewo, Numer[x] Ponumerow 1 NKolejka 1; Kolejka[NKolejka] x @ P Q @ A B FD@ [NKolejka > 0 Z R STSU X Y VW v Kolejka[1] NKolejka NKolejka 1 BNKolejka BKolejka[i] Kolejka[i + 1] E \ ] BCi 1 a = 1 b = 2 c = 3 w I v [i] Numer[w] = 0 Ponumerow Ponumerow + 1 Numer[w] Ponumerow Drzewo Drzewo {vw} NKolejka NKolejka + 1 Kolejka[N Kolejka] w E`C^(Numer,Drzewo, C [ \ B ] BCi 1 \ B E BNIv D ] F [^ E [ V _[RSTSU W @ R STSU X X VW Y Y) R STSU X VW Y {vw} d = 4 e = 5 f = 6 g = 7 v e Kolejka f,g NKolejka 2 w b w d w f Algorytmy grafowe (AGR 320) p. 30/9
pq rst u vwx G,x ~ } y { yz Ÿ ž œ š f N umer, Drzewo, Numer[x] Ponumerow 1 NKolejka 1; Kolejka[NKolejka] x q qr s wuq ŒNKolejka > 0 ƒ ˆ Š v Kolejka[1] NKolejka NKolejka 1 snkolejka skolejka[i] Kolejka[i + 1] v Ž sti 1 a = 1 b = 2 c = 3 t Œ s Ž sti 1 w I v [i] Numer[w] = 0 Ponumerow Ponumerow + 1 Numer[w] Ponumerow Drzewo Drzewo {vw} NKolejka NKolejka + 1 Kolejka[N Kolejka] w s v sniv u Ž w Œ v ˆ Œƒ qœ v t (Numer,Drzewo, Š ƒ ˆ Š) ƒ ˆ Š {vw} d = 4 e = 5 f = 6 g = 7 v f Kolejka g NKolejka 1 w b w c w g Algorytmy grafowe (AGR 320) p. 31/9
G,x ª ª«± Ã Ñ Ð Î Ï Í ÌÉ ÈË Ê Æ ÈÉ Ç Ä ÅÆ Æg N umer, Drzewo, Numer[x] Ponumerow 1 NKolejka 1; Kolejka[NKolejka] x ² ³ ½NKolejka > 0 ¼ º µ µ ¹» v Kolejka[1] NKolejka NKolejka 1 NKolejka Kolejka[i] Kolejka[i + 1] ¾ i 1 a = 1 b = 2 c = 3 ½ ¾ i 1 w I v [i] Numer[w] = 0 Ponumerow Ponumerow + 1 Numer[w] Ponumerow Drzewo Drzewo {vw} NKolejka NKolejka + 1 Kolejka[N Kolejka] w ¾ NIv ½À ¹ Á½ µ µ ½  À(Numer,Drzewo, º» º µ µ ¹») º µ µ ¹» {vw} d = 4 e = 5 f = 6 g = 7 v g Kolejka NKolejka 0 w c w f Algorytmy grafowe (AGR 320) p. 32/9
3.2 Przeszukiwanie grafu w głab (DFS) G = (V, E) - graf nieskierowanym reprezentowanym w postaci listy wierzchołków sasiednich. x - ustalony wierzchołek z którego należy rozpoczać przeszukiwanie grafu I v - tablica zawierajaca wierzchołki incydentne z v, NI v liczba elementów w I v Stos - tablica przechowujaca ciag wierzchołków umożliwiajaca powrót", N Stos - liczba wierzchołków w Stos Algorytmy grafowe (AGR 320) p. 33/9
1. Ustaw v x, i 0, Drzewo, Pozostale. 2. Ustaw i i + 1, Numer(v) i. 3. Poszukaj nieprzebytej krawędzi incydentnej do wierzchołka v. Jeżeli nie ma takiej krawędzi (tzn. po każdej krawędzi incydentnej do v już przeszliśmy), to przejdź do kroku 5. Wybierz pierwsza nieprzebyta krawędź incydentna do wierzchołka v, powiedzmy vw i przejdź ja. Algorytmy grafowe (AGR 320) p. 34/9
4. Jesteśmy teraz w wierzchołku w. Jeżeli w jest wierzchołkiem, w którym jeszcze nie byliśmy podczas tego szukania (tzn. N umer(w) jest nieokreślony), to dodaj krawędź vw do zbioru Drzewo. Ustaw v w i przejdź do kroku 2. Jeżeli w jest wierzchołkiem, w którym już wcześniej byliśmy (tzn. Numer(w) < Numer(v)), to dodaj krawędź vw do zbioru P ozostale. Przejdź do kroku 3. Jesteśmy więc z powrotem w wierzchołku v. Algorytmy grafowe (AGR 320) p. 35/9
5. Sprawdź, czy istnieje jakaś przebyta krawędź uv w zbiorze Drzewo z Numer(u) < Numer(v). Jeżeli jest taka krawędź, to wróć do wierzchołka u. (Zauważmy, że u jest wierzchołkiem, z którego osiagnięto v po raz pierwszy). Ustaw v u i przejdź do kroku 3. Jeżeli nie ma takiej krawędzi, to zatrzymaj algorytm (jesteśmy z powrotem w korzeniu x po przejściu każdej krawędzi i odwiedzeniu każdego wierzchołka połaczonego z x). Algorytmy grafowe (AGR 320) p. 36/9
Ô Ó Ò Õ Ö Ý (G, x) Numer[x] Ponumerow 1 NStos 1 Stos[NStos] x NStos > 0 Ú Ù ÛÜ Ø Þ ßv STos[NStos] à â å ç è ê Õ NI v = 0 änstos NStos 1 w I v [1] NI v NI v 1 i 1 Ú á ÙÜ ã Ûæ Ü Ü á ßé ã ßNIv Õ Ö Õ Ú á Þ ßIv [i] Iv[i 1] Numer[w] = 0 äponumerow Ponumerow + 1 ÙÜ ã Õ Ý Õ à Õ â Õ å Õ Ûæ Ü Ü Numer[w] Ponumerow Drzewo Drzewo {vw} NStos Nstos + 1 Stos[NStos] w {vw} ë ìíì ñò ïð î ë ìíì ñò ïð î ñò ïð î ë ìíì ýù ü ú øû ø ù ö ô õ ã óé ä éü ç Õ Algorytmy grafowe (AGR 320) p. 37/9
þ ÿ G, x N umer, Drzewo, Numer[x] Ponumerow 1 NStos 1; Stos[NStos] x NStos > 0 v STos[NStos] NI v = 0 $NStos NStos 1 w I v [1] NI v NI v 1 i 1 NI v I v [i] I v [i 1] Numer[w] = 0 Ponumerow Ponumerow + 1 Numer[w] Ponumerow Drzewo Drzewo {vw} NStos Nstos + 1 Stos[NStos] w {vw} ) ÿ ÿ ÿ " ÿ& " " $ ÿ& * $(Numer, Drzewo,! # % ' ( )! # % ' ( Algorytmy grafowe (AGR 320) p. 38/9
Przykład. Przeszukiwanie grafu w głab 0 12345 +, -./ G,x 7 89: 46 ; M R STU PQ N O PV O N umer, Drzewo, Numer[x] Ponumerow 1 NStos 1; Stos[NStos] x - F, <,. = 20, GNStos > 0 Ḣ /G v STos[NStos] NI v = 0 0 I 1 D B C E >?@?A 2 GJNStos NStos 1, G KG w I v [1] NI v NI v 1 I./i 1 Ḣ 0 I 2 1 GJ 1 L/J(Numer,Drzewo, 1.NIv I v [i] I v [i 1] Numer[w] = 0 Ponumerow Ponumerow + 1 Numer[w] Ponumerow Drzewo Drzewo {vw} NStos Nstos + 1 Stos[NStos] w B KG>?@?A C, G D E D B C >?@?A E) B C >?@?A D E {vw} a = 1 b c d e f g Numer[a] 1 Ponumerow 1 Stos [a] NStos 1 Algorytmy grafowe (AGR 320) p. 39/9
WX YZ[ G,x c def `b ]^_`a \ g y }~ z { a N umer, Drzewo, Numer[x] Ponumerow 1 NStos 1; Stos[NStos] x Y r X h X Z i ^\X snstos > 0 p n o q j klkm v STos[NStos] NI v = 0 ^svnstos NStos 1 w I v [1] NI v NI v 1 \ u ] b = 2 a = 1 c ZNIv ZIv[i] Iv[i 1] ] t u Z[i 1 t Z [s Xs ws Numer[w] = 0 Ponumerow Ponumerow + 1 Numer[w] Ponumerow Drzewo Drzewo {vw} NStos Nstos + 1 Stos[NStos] w \ u ^sv ] ] x[v(numer,drzewo, n wsjklkm o Xs p q p n o j klkm q) n o j klkm p q {vw} d e f g v a w b Ponumerow 2 Numer[b] 2 Drzewo {ab} NStos 2 Stos [a,b] Algorytmy grafowe (AGR 320) p. 40/9
ƒ ˆ Š Œ G,x Ž ª«ª«² ± ³b N umer, Drzewo, Numer[x] Ponumerow 1 NStos 1; Stos[NStos] x ƒ ƒ v STos[NStos] NI v = 0 ƒ žnstos > 0 ˆ š œ w I v [1] NI v NI v 1 i 1 ˆ NIv ž NStos NStos 1 Ÿ Iv[i] Iv[i 1] a = 1 b = 2 c = 3 Ÿ ƒ ž ž Numer[w] = 0 Ponumerow Ponumerow + 1 Numer[w] Ponumerow Drzewo Drzewo {vw} ˆ ž NStos Nstos + 1 Stos[NStos] w ˆ (Numer,Drzewo, ž ž š ƒ ž œ š œ) š œ {vw} d e f g v b w a w c Ponumerow 3 Numer[c] 3 Drzewo {ab,bc} NStos 3 Stos [a,b,c] Algorytmy grafowe (AGR 320) p. 41/9
¹ º»¼½¾ µ G,x À ÁÂà ½ Ä Ö ÜÝ àþû ß Þ ÜÝ Ù ÚÛ Ø ä ã á â åc N umer, Drzewo, Numer[x] Ponumerow 1 NStos 1; Stos[NStos] x Ï µ µ Å Æ v STos[NStos] NI v = 0»¹µ ÐNStos > 0 ¹ Ò º Í Ë Ì Î Ç ÈÉÈÊ w I v [1] NI v NI v 1 Ò i 1 º NIv Ñ Iv[i] Iv[i 1]» ÐÓNStos NStos 1 a = 1 b = 2 c = 3 Ñ Ð µ Ð ÔÐ Numer[w] = 0 Ponumerow Ponumerow + 1 Numer[w] Ponumerow Drzewo Drzewo {vw} NStos Nstos + 1 Stos[NStos] w ¹ Ò» º ÐÓ º Õ Ó(Numer,Drzewo, Ë ÔÐÇÈÉÈÊ Ì µ Ð Í Î Í Ë Ì Ç ÈÉÈÊ Î) Ë Ì Ç ÈÉÈÊ Í Î {vw} d e f = 4 g v c w a w b w f Ponumerow 4 Numer[f] 3 Drzewo {ab,bc,cf} NStos 4 Stos [a,b,c,f] Algorytmy grafowe (AGR 320) p. 42/9
ë ìíîïð æç èéê G,x ò óôõ ïñ ö f N umer, Drzewo, Numer[x] Ponumerow 1 NStos 1; Stos[NStos] x è ç ç é ø v STos[NStos] NI v = 0 íëç NStos > 0 ë ì ÿ ý þ ù úûúü w I v [1] NI v NI v 1 í NStos NStos 1 éniv éiv[i] Iv[i 1] ì éêi 1 a = 1 b = 2 c = 3 ê é ç Numer[w] = 0 Ponumerow Ponumerow + 1 Numer[w] Ponumerow Drzewo Drzewo {vw} NStos Nstos + 1 Stos[NStos] w ë í ì ì ê (Numer,Drzewo, ý ùúûúü þ ç ÿ ÿ ý þ ù úûúü ) ý þ ù úûúü ÿ {vw} d e f = 4 g = 5 v f w b w c w g Ponumerow 5 Numer[g] 5 Drzewo {ab,bc,cf,fg} NStos 5 Stos [a,b,c,f,g] Algorytmy grafowe (AGR 320) p. 43/9
G,x &' % $!!" # ( : ; <=> BE D BC? @A = H F BC G F J I > K @g N umer, Drzewo, Numer[x] Ponumerow 1 NStos 1; Stos[NStos] x 3 ) * v STos[NStos] NI v = 0 4NStos > 0 6 1 /0 2 +,-,. w I v [1] NI v NI v 1 47NStos NStos 1 NIv Iv[i] Iv[i 1] 5 6 i 1 a = 1 b = 2 c = 3 4 5 4 84 Numer[w] = 0 Ponumerow Ponumerow + 1 Numer[w] Ponumerow Drzewo Drzewo {vw} NStos Nstos + 1 Stos[NStos] w 6 47 97(Numer,Drzewo, / 84+,-,. 0 4 1 1 2 2) +,-,. /0 1 /0 +,-,. 2 {vw} d e f = 4 g = 5 v g w c w f NStos 4 Stos [a,b,c,f] Algorytmy grafowe (AGR 320) p. 44/9
LM NOP Q RST G,x Z[ Y X U UV W \ n o pqr vy x vw s tu q z vw { z ~ } r tf N umer, Drzewo, Numer[x] Ponumerow 1 NStos 1; Stos[NStos] x N g M ]^ M O v STos[NStos] NI v = 0 SQM hnstos > 0 Q j R w I v [1] NI v NI v 1 e _à`b cd f S hknstos NStos 1 b = 2 a = 1 c ONIv OIv[i] Iv[i 1] R i j OPi 1 Ph i O Mh lh Numer[w] = 0 Ponumerow Ponumerow + 1 Numer[w] Ponumerow Drzewo Drzewo {vw} NStos Nstos + 1 Stos[NStos] w Q j S R hk R mpk(numer,drzewo, c lh_à`b d Mh e e f f) _à`b cd e _à`b cd f {vw} d e f = 4 g = 5 v f NStos 3 Stos [a,b,c] Algorytmy grafowe (AGR 320) p. 45/9
ƒ G,x Ž Œ Š ˆ ª ª«ª«² ± ³ c N umer, Drzewo, Numer[x] Ponumerow 1 NStos 1; Stos[NStos] x ƒ v STos[NStos] NI v = 0 œnstos > 0 ž w I v [1] NI v NI v 1 š œÿnstos NStos 1 ƒniv ƒiv[i] Iv[i 1] ž ƒ i 1 a = 1 b = 2 c = 3 œ ƒ œ œ Numer[w] = 0 Ponumerow Ponumerow + 1 Numer[w] Ponumerow Drzewo Drzewo {vw} NStos Nstos + 1 Stos[NStos] w ž œÿ Ÿ(Numer,Drzewo, œ œ š) š š {vw} d e f = 4 g = 5 v c w g NStos 2 Stos [a,b] Algorytmy grafowe (AGR 320) p. 46/9
¹ º»¼ µ G,x Âà Á À ½ ½¾ Ä Ö ÜÝ Ù ÚÛ Ø Û à Þ ÜÝ ß Þ ã á â ä åb N umer, Drzewo, Numer[x] Ponumerow 1 NStos 1; Stos[NStos] x µ Å µ Æ»¹µ ÐNStos > 0 Ï v STos[NStos] NI v = 0 ¹ Ò º Í ËÌ Î Ç ÈÉÈÊ w I v [1] NI v NI v 1 Ò i 1 º NIv Ñ Iv[i] Iv[i 1]» ÐÓNStos NStos 1 a = 1 b = 2 c = 3 Ð Ñ µ Ð ÔÐ Numer[w] = 0 Ponumerow Ponumerow + 1 Numer[w] Ponumerow Drzewo Drzewo {vw} NStos Nstos + 1 Stos[NStos] w ¹ Ò» º ÐÓ º Õ Ó(Numer,Drzewo, Ë ÔÐÇÈÉÈÊ Ì µ Ð Í Í Î Î) Ç ÈÉÈÊ ËÌ Í ËÌ Ç ÈÉÈÊ Î {vw} d = 6 e f = 4 g = 5 v b w d Ponumerow 6 Numer[d] 5 Drzewo {ab,bc,cf,fg,bd} NStos 3 Stos [a,b,d] Algorytmy grafowe (AGR 320) p. 47/9
æç èéê ë ìíî G,x ôõ ó ò ï ïð ñ ö d N umer, Drzewo, Numer[x] Ponumerow 1 NStos 1; Stos[NStos] x è ç ç é ø v STos[NStos] NI v = 0 íëç NStos > 0 ë ì ÿ ýþ ù úûúü w I v [1] NI v NI v 1 í NStos NStos 1 éniv éiv[i] Iv[i 1] ì éêi 1 a = 1 b = 2 c = 3 é ê ç Numer[w] = 0 Ponumerow Ponumerow + 1 Numer[w] Ponumerow Drzewo Drzewo {vw} NStos Nstos + 1 Stos[NStos] w ë í ì ì ê (Numer,Drzewo, ý ùúûúü þ ç ÿ ÿ ) ù úûúü ýþ ÿ ýþ ù úûúü {vw} d = 6 e = 7 f = 4 g = 5 v d w b w e Ponumerow 7 Numer[e] 7 Drzewo {ab,bc,cf,fg,bd,de} NStos 4 Stos [a,b,d,e] Algorytmy grafowe (AGR 320) p. 48/9
G,x % &'( "# "$! ) ; F @G C DE B A @? < => FH =GE A L K I J @e N umer, Drzewo, Numer[x] Ponumerow 1 NStos 1; Stos[NStos] x 4 * + v STos[NStos] NI v = 0 5NStos > 0 7 2 0 1 3, -.-/ w I v [1] NI v NI v 1 58NStos NStos 1 NIv Iv[i] Iv[i 1] 6 7 i 1 a = 1 b = 2 c = 3 6 5 5 95 Numer[w] = 0 Ponumerow Ponumerow + 1 Numer[w] Ponumerow Drzewo Drzewo {vw} NStos Nstos + 1 Stos[NStos] w 7 58 :8(Numer,Drzewo, 0 95,-.-/ 1 5 2 3 2 0 1, -.-/ 3) 0 1, -.-/ 2 3 {vw} d = 6 e = 7 f = 4 g = 5 v e w b w d NStos 3 Stos [a,b,d] Algorytmy grafowe (AGR 320) p. 49/9
R STUVW MN OPQ G,x Y Z[\ VX ] p o { u x yz w v u t q rs {} r z v ~ ud àbacnumer,drzewo, Numer[x] Ponumerow 1 NStos 1; Stos[NStos] x N P^_ NO TRN instos > 0 h v STos[NStos] NI v = 0 R k S w I v [1] NI v NI v 1 f d e g T ilnstos NStos 1 PNIv PIv[i] Iv[i 1] S j k PQi 1 a = 1 b = 2 c = 3 j P Qi Ni mi Numer[w] = 0 Ponumerow Ponumerow + 1 Numer[w] Ponumerow Drzewo Drzewo {vw} NStos Nstos + 1 Stos[NStos] w R k T S il S nql(numer,drzewo, d mìabac e Ni f g f d àbac e g) f d àbac e g {vw} d = 6 e = 7 f = 4 g = 5 v d NStos 2 Stos [a,b] Algorytmy grafowe (AGR 320) p. 50/9
ªb ƒ ˆ Š Œ G,x Ž ª± «ª ± ² «µ ³ N umer, Drzewo, Numer[x] Ponumerow 1 NStos 1; Stos[NStos] x ƒ ƒ v STos[NStos] NI v = 0 ƒ žnstos > 0 ˆ š œ w I v [1] NI v NI v 1 i 1 ˆ NIv ž NStos NStos 1 Ÿ Iv[i] Iv[i 1] a = 1 b = 2 c = 3 Ÿ ƒ ž ž Numer[w] = 0 Ponumerow Ponumerow + 1 Numer[w] Ponumerow Drzewo Drzewo {vw} ˆ ž NStos Nstos + 1 Stos[NStos] w ˆ (Numer,Drzewo, ž ž š ƒ ž œ š œ) š œ {vw} d = 6 e = 7 f = 4 g = 5 v b w f NStos 1 Stos [a] Algorytmy grafowe (AGR 320) p. 51/9
¼ ½¾ ÀÁ ¹º» G,x à ÄÅÆ ÀÂ Ç Ú Ù å ßæ â ãä á à ß Þ Û ÜÝ åç Üæä à ë ê è é ßa N umer, Drzewo, Numer[x] Ponumerow 1 NStos 1; Stos[NStos] x ¾¼ ÓNStos > 0 v STos[NStos] NI v = 0 ¹ Ò ºÈ É ¼ Õ ½ Ð Î Ï Ñ Ê ËÌËÍ w I v [1] NI v NI v 1 ¾ ÓÖNStos NStos 1 ºNIv ºIv[i] Iv[i 1] ½ Ô Õ º»i 1 a = 1 b = 2 c = 3 Ô º»Ó Ó Ó Numer[w] = 0 Ponumerow Ponumerow + 1 Numer[w] Ponumerow Drzewo Drzewo {vw} NStos Nstos + 1 Stos[NStos] w ¼ Õ ¾ ½ ÓÖ ½ Ø»Ö(Numer,Drzewo, Î ÓÊËÌËÍ Ï Ó Ð Ñ Ð Î Ï Ê ËÌËÍ Ñ) Î Ï Ê ËÌËÍ Ð Ñ {vw} d = 6 e = 7 f = 4 g = 5 v a w c NStos 0 Stos [ ] Algorytmy grafowe (AGR 320) p. 52/9
Własności DFS las przeszukiwań w głab (drzewo gdy graf jest spójny) wierzchołek odwiedzony - odwiedzony po raz pierwszy podczas przeszukiwania wierzchołek przetworzony - lista sasiedztwa została całkowicie zbadana etykiety czasowe : każdemu wierzchołki przyporzadkowujemy dwie liczby całkowite z przedziału 1,...2 V czas odwiedzin czas przetworzenia Algorytmy grafowe (AGR 320) p. 53/9
Algorytmy grafowe (AGR 320) p. 54/9
1/ Algorytmy grafowe (AGR 320) p. 55/9
1/ 2/ Algorytmy grafowe (AGR 320) p. 56/9
1/ 2/ 3/ Algorytmy grafowe (AGR 320) p. 57/9
1/ 2/ 3/ 4/ Algorytmy grafowe (AGR 320) p. 58/9
1/ 2/ 3/ 4/ 5/ Algorytmy grafowe (AGR 320) p. 59/9
1/ 2/ 3/ 4/ 5/ Algorytmy grafowe (AGR 320) p. 60/9
1/ 2/ 3/ 4/ 5/6 Algorytmy grafowe (AGR 320) p. 61/9
1/ 2/ 3/ 4/ 5/6 Algorytmy grafowe (AGR 320) p. 62/9
1/ 2/ 3/ 4/ 7 5/6 Algorytmy grafowe (AGR 320) p. 63/9
1/ 2/ 3/ 4/ 7 5/6 Algorytmy grafowe (AGR 320) p. 64/9
1/ 2/ 3/ 8 4/ 7 5/6 Algorytmy grafowe (AGR 320) p. 65/9
1/ 2/ 3/ 8 9/ 4/ 7 5/6 Algorytmy grafowe (AGR 320) p. 66/9
1/ 2/ 3/ 8 9/ 10/ 4/ 7 5/6 Algorytmy grafowe (AGR 320) p. 67/9
1/ 2/ 3/ 8 9/ 10/ 4/ 7 5/6 Algorytmy grafowe (AGR 320) p. 68/9
1/ 2/ 3/ 8 9/ 10/11 4/ 7 5/6 Algorytmy grafowe (AGR 320) p. 69/9
1/ 2/ 3/ 8 9/ 12 10/11 4/ 7 5/6 Algorytmy grafowe (AGR 320) p. 70/9
1/ 2/ 13 3/ 8 9/ 12 10/11 4/ 7 5/6 Algorytmy grafowe (AGR 320) p. 71/9
1/ 14 2/ 13 3/ 8 9/ 12 10/11 4/ 7 5/6 Algorytmy grafowe (AGR 320) p. 72/9
Algorytmy grafowe (AGR 320) p. 73/9
1/ Algorytmy grafowe (AGR 320) p. 74/9
1/ 2/ Algorytmy grafowe (AGR 320) p. 75/9
1/ 2/ 3/ Algorytmy grafowe (AGR 320) p. 76/9
1/ 2/ 3/ 4/ Algorytmy grafowe (AGR 320) p. 77/9
1/ 2/ 3/ 4/ Algorytmy grafowe (AGR 320) p. 78/9
1/ 2/ 3/ 4/5 Algorytmy grafowe (AGR 320) p. 79/9
1/ 2/ 3/ 6 4/5 Algorytmy grafowe (AGR 320) p. 80/9
1/ 2/ 7 3/ 6 4/5 Algorytmy grafowe (AGR 320) p. 81/9
1/ 2/ 7 8/ 3/ 6 4/5 Algorytmy grafowe (AGR 320) p. 82/9
1/ 2/ 7 8/ 3/ 6 4/5 Algorytmy grafowe (AGR 320) p. 83/9
1/ 2/ 7 8/9 3/ 6 4/5 Algorytmy grafowe (AGR 320) p. 84/9
1/ 10 2/ 7 8/9 3/ 6 4/5 Algorytmy grafowe (AGR 320) p. 85/9
1/ 10 2/ 7 8/9 3/ 6 4/5 11/ Algorytmy grafowe (AGR 320) p. 86/9
1/ 10 2/ 7 8/9 3/ 6 4/5 11/ 12/ Algorytmy grafowe (AGR 320) p. 87/9
1/ 10 2/ 7 8/9 3/ 6 4/5 11/ 12/ Algorytmy grafowe (AGR 320) p. 88/9
1/ 10 2/ 7 8/9 3/ 6 4/5 11/ 12/13 Algorytmy grafowe (AGR 320) p. 89/9
1/ 10 2/ 7 8/9 3/ 6 4/5 11/ 12/13 Algorytmy grafowe (AGR 320) p. 90/9
1/ 10 2/ 7 8/9 3/ 6 4/5 11/14 12/13 Algorytmy grafowe (AGR 320) p. 91/9
Algorytm DFS w wersji rekurencyjnej ñ òóô ï ð ìíî G, x ûü ú ù ø õ ö õ ö ý N umer, Drzewo, v x Numer[v] Ponumerowano 1 w Γ(v) Numer[w] = 0 Ponumerowano Ponumerowano + 1 N umer[w] P onumerowano Drzewo Drzewo {vw} (G, w) Numer(w) < Numer(v) {vw} (N umer, Drzewo, ) í þ ÿ í ï î ïð ó ÿ ñ ï ó ò í ó ò ò ð ð ñ û ú ù Algorytmy grafowe (AGR 320) p. 92/9
Przykładem zastosowania procedury DF S jest algorytm NUMEROWANIEWSZYSTKICHWIERZCHOŁKÓW, który wykorzystuje procedurę DFS do ponumerowania wszystkich wierzchołków grafu G. & '()' # $%! " G 1 0 / "!. +, - ( &%, - +% * v V Numer[v] 0 Drzewo v V Numer[v] = 0 2 3 2 3 6 4 5 4 5 2 6 7 898: => ;< 3? B A @ (G, v) Algorytmy grafowe (AGR 320) p. 93/9
Uwagi końcowe: złożoność DFS (i wielu algorytmów wykorzystujacych DFS) jest rzędu O( V + E ) dodatkowe informacje na temat poprawności obu algorytmów przeszukiwania grafow oraz ich zastosowań sa zawarte Rozdziale 23 ksiażki Cormena, Leisersona i Rivesta (patrz literatura pomocnicza wykładu) Algorytmy grafowe (AGR 320) p. 94/9