Algorytmy i Struktury Danych. Grafy Bożena Woźna-Szcześniak bwozna@gmail.com Jan Długosz University, Poland Wykład 8 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 1 / 39
Plan wykładu Wyszukiwanie spójnych składowych grafu (ang. Connected components) Sortowanie topologiczne (ang. Topological sort) Cykle Eulera Algorytm Bellmana-Forda Algorytm Dijkstry Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 2 / 39
Spójne składowe Definicja Każda spójna składowa grafu G = (V, E) jest maksymalnym podzbiorem wierzchołków U zbioru V takim, że dla dowolnych dwóch wierzchołków z U istnieje łacz aca je ścieżka w G. Jeżeli graf składa się z jednej spójnej składowej to mówimy, że jest spójny (ang. connected). Każdy graf nieskierowany można podzielić na jedna lub większa liczbę spójnych składowych (ang. connected components). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 3 / 39
Spójne składowe Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 4 / 39
Spójne podgrafy Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 5 / 39
Spójne składowe - algorytm Wejście: G = (V, E) Wyjście: Spójne składowe grafu G 1 J. Hopcroft, R. Tarjan. Efficient algorithms for graph manipulation. 1973. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 6 / 39
Spójne składowe - algorytm Wejście: G = (V, E) Wyjście: Spójne składowe grafu G Algorytmy DFS oraz BFS wyznaczaja spójne składowe grafu G 1. 1 J. Hopcroft, R. Tarjan. Efficient algorithms for graph manipulation. 1973. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 6 / 39
Spójne składowe - algorytm Wejście: G = (V, E) Wyjście: Spójne składowe grafu G Algorytmy DFS oraz BFS wyznaczaja spójne składowe grafu G 1. Złożoność: O((m + n). 1 J. Hopcroft, R. Tarjan. Efficient algorithms for graph manipulation. 1973. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 6 / 39
Spójne składowe - algorytm Wejście: G = (V, E) Wyjście: Spójne składowe grafu G Algorytmy DFS oraz BFS wyznaczaja spójne składowe grafu G 1. Złożoność: O((m + n). Algorytm wyszukiwania spójnych składowych może zostać tak zaimplementowany, aby jego koszt zamorytzowany był: O(α(m, n)), gdzie α jest bardzo słabo rosnac a odwrotnościa funkcji Ackermana, która wynosi co najwyżej 5 dla wszystkich możliwych m oraz n. 1 J. Hopcroft, R. Tarjan. Efficient algorithms for graph manipulation. 1973. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 6 / 39
Spójne składowe - algorytm DFS Require: Graf (V, E), tablica visited o rozmiarze V = n Algorytm DFS: 1: for all i := 1 to n do 2: visited[i] := 0; 3: end for 4: for all i := 1 to n do 5: if visited[i] = 0 then 6: visit(i); 7: end if 8: end for Require: Graf (V, E), tablica visited o rozmiarze V = n Algorytm visit(i): 1: print(i); 2: visited[i] := 1; 3: for each neighbor j of i do 4: if visited[j] = 0 then 5: visit(j); 6: end if 7: end for Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 7 / 39
Spójne składowe Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 8 / 39
Sortowanie Topologiczne - sformułowanie problemu Wejście: Acykliczny graf skierowany G = (V, E). Wyjście: Liniowy porzadek wierzchołków z V taki, że jeśli graf G zawiera krawędź (u, v), to w tym porzadku wierzchołek u występuje przed wierzchołkiem v. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 9 / 39
Sortowanie Topologiczne - przykład Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 10 / 39
Sortowanie topologicznie Wierzchołki w każdym grafie acyklicznym skierowanym można posortować topologicznie na jeden lub więcej sposobów 7,5,3,11,8,2,9,10 7,5,11,2,3,10,8,9 3,7,8,5,11,10,9,2 5,7,11,2,3,8,9,10 7 5 3 11 8 2 9 10 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 11 / 39
Sortowanie Topologiczne - algorytm bazujacy na DFS Wykonaj TopologicalDFS na wejściowym acyklicznym grafie skierowanym G = (V, E). Wypisz wierzchołki w porzadku malejacym ze względu na ich czas końcowy - umieszczony w tablicy final. Złożoność: O( V + E ) Require: Graf G, tablice visited oraz final o rozmiarze V = n Algorytm TopologicalDFS: 1: t := 0 2: for all i := 1 to n do 3: visited[i] := 0; final := 0 4: end for 5: for all i := 1 to n do 6: if visited[i] = 0 then 7: visit(i, final); 8: end if 9: end for Algorytm visit(i,final): 1: visited[i] := 1; 2: for each outgoing edge j of i do 3: if visited[j] = 0 then 4: visit(j, final); 5: end if 6: end for 7: t = t + 1; 8: final[i] = t; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 12 / 39
Sortowanie Topologiczne - przykład Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 13 / 39
Sortowanie topologiczne - Algorytm 2 Metoda usuwania wierzchołków o stopniu wejściowym równym zero Wykorzystywana własność: jeśli graf jest acyklicznym grafem skierowanym, to posiada przynajmniej jeden wierzchołek o stopniu wejściowym równym zero. Idea: Dopóki graf posiada wierzchołki o stopniu wejściowym zero, znajdujemy taki wierzchołek, usuwamy go z grafu wraz ze wszystkimi wychodzacymi z niego krawędziami i umieszczamy go na liście wierzchołków posortowanych topologicznie. Jeśli w grafie pozostana jakieś wierzchołki, to graf posiada cykle i sortowania topologicznego nie można wykonać. Złożoność: O( V + E ) Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 14 / 39
Sortowanie topologiczne - Algorytm 2 Algorytm: G = (V, E) 1: Q - Zbiór wszystkich wierzchoków bez krawędzi wchodzacych; 2: while Q! = do 3: Usuń wierzchołek n z Q. 4: Wypisz n. 5: for all m V takiego, że (n, m) E do 6: E = E \(n, m) 7: if m nie ma już więcej krawędzi wchodzacych then 8: Wstaw m do Q. 9: end if 10: end for 11: end while 12: if E! = then 13: Graf G ma cykl. 14: end if Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 15 / 39
Sortowanie topologiczne - Algorytm 2, przykład 1 4 4 4 3 3 3 2 5 Usuwamy 1 5 2 Usuwamy 2 5 4 Usuwamy 3 5 Usuwamy 4 5 Usuwamy 5 Sortowanie topologiczne: 1, 2, 3, 4, 5 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 16 / 39
Cykl Eulera Droga Eulera w grafie (skierowanym), to droga prosta, która zawiera każda krawędź grafu dokładnie jeden raz. Cykl Eulera to taki cykl w grafie, który zawiera każda krawędź grafu dokładnie jeden raz. Warunkiem istnienia cyklu sa: spójność grafu. dla grafu skierowanego należy sprawdzić, czy dla każdego wierzchołka stopień wyjściowy jest równy stopniu wejściowemu. dla grafu nieskierowanego z każdego wierzchołka musi wychodzić parzysta liczba krawędzi. Graf, który posiada cykl Eulera nazywany jest grafem eulerowskim Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 17 / 39
Cykl Eulera - idea Zaczynamy od dowolnego wierzchołka (na przykład tego z najmniejszym indeksem), dodajemy ten wierzchołek na stos i idziemy do następnego osiagalnego z niego wierzchołka z najmniejszym indeksem, a łacz aca go z nim drogę usuwamy. Dodajemy ten wierzchołek na stos i idziemy do następnego osiagalnego wierzchołka z najmniejszym indeksem, a łacz ac a go z nim drogę usuwamy, itd. Jeżeli nie możemy już nigdzie pójść pobieramy element ze stosu (będzie on kolejnym w cyklu) i teraz z ostatniego wierzchołka na stosie idziemy dalej. Czynność powtarzamy tak długo jak długo mamy jakieś wierzchołki na stosie. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 18 / 39
Cykl Eulera - przykład (1) (2) (3) (4) a b c d e a b c d e a b c d e a b c d e Stos: a,b Stos: a,b,c Stos: a,b,c, a (5) (6) (7) a b c d e a b c d e a b c d e a b c d e Stos: a,b,d Stos: a,b,d,e Stos: a,b,d,e,b Cykl: a,c Cykl: a,c Cykl: a,c Cykl: a,c,b,e,d,b,a Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 19 / 39
Czy można narysować następujac a kopertę bez odrywania kredki od papieru i nie rysujac dwukrotnie żadnego odcinka? Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 20 / 39
Graf spójny, który ma nie więcej niż dwa wierzchołki stopnia nieparzystego, ma drogę Eulera. Wniosek: w grafie reprezentujacym kopertę jest droga Eulera, ale nie ma cyklu. Spójny graf skierowany ma drogę Eulera, gdy dla każdego wierzchołka v zachodzi stopień_wyjściowy(v) = stopień_wejściowy(v), albo gdy istnieja dokładnie dwa weirzchołki v 1 i v 2 nie spełniajace tego warunku, dla których zachodzi: stopień_wejściowy(v 1 ) - stopień_wyjściowy(v 1 ) = stopień_wejściowy(v 2 )-stopień_wyjściowy(v 2 ) = 1. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 21 / 39
Cykl Eulera - Zastosowania Rysowanie/wycinanie figur przy pomocy plotera Problem chińskiego listonosza W roku 1962 chiński matematyk Mei-Ko Kwan sformułował następujacy problem: Listonosz roznoszac listy musi przejść przez wszystkie ulice w swojej dzielnicy co najmniej jeden raz i wrócić na pocztę. Ponieważ jest człowiekiem leniwym, chciałby mieć jak najkrótsza do przejścia trasę. Znalezienie takiej trasy jest problemem, który nazwano problemem chińskiego listonosza (ang. Chinese postman problem - CPP). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 22 / 39
Etykietowany graf skierowany Definicja Etykietowanym grafem skierowanym nazywamy strukturę G = (V, E, w : E Z) gdzie V to zbiór wierzchołków, E {(u, v) : u, v V} to zbiór uporzadkowanych par wierzchołków ze zbioru V, zwanych krawędziami. w : E Z jest funkcja wagi; wagi reprezentuja pewne wielkości (np. długość drogi). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 23 / 39
Etykietowany graf skierowany - przykład 1 3 1 u 2-3 2 3 Pytanie: Czy najkrótsza ścieżka pomiędzy wierzchołkami u i v może zawierać cykl? 1 v 1 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 24 / 39
Etykietowany graf skierowany - przykład 1 3 1 u 2 1-3 v 1 2 3 Pytanie: Czy najkrótsza ścieżka pomiędzy wierzchołkami u i v może zawierać cykl? Odpowiedź: Jeśli w graf istnieje najkrótsza ścieżka z u do v, to w grafie tym również istnieje najkrótsza ścieżka z u do v, która nie zawiera cykli. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 24 / 39
Drzewo najkrótszych ścieżek Sformułowanie problemu Wejście: Etykietowany graf skierowany G = (V, E, w : E Z) Wierzchołek r V. Wyjście: Drzewo T o korzeniu r takie, że ścieżka z r do każdego wierzchołka u w T jest najkrótsza sieżka z r do u w grafie G. Założenie: Rozważane grafy maja wierzchołki osiagalne z wybranego wierzchołka (korzenia) r a. a Dlaczego? Wierzchołki nieosiagalne moga być usunięte w czasie liniowym Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 25 / 39
Czy najkrótsza ścieżka zawsze istnieje? Raczej nie... Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 26 / 39
Graf G bez ujemnych cykli - własności Graf G posiada drzewo najkrótszych ścieżek wtedy i tylko wtedy, gdy G nie zawiera ujemnych cykli. Usunięcie cyklu ze ścieżki nie zwiększa jej długości. Dla każdego wierzchołka u grafu G istnieje najkrótsza ścieżka z korzenia r do wierzchołka u, która nie zawiera cykli. Suma wszystkich tych n najkrótszych ścieżek (przypomnijmy, że rozmiar zbioru wierzchołków jest oznaczany przez n) jest drzewem najkrótszych ścieżek grafu G ukorzenionego w wierzchołku r. 2 Przez odległość od wierzchołka r do wierzchołka u w grafie G rozumiemy długość najkrótszej ścieżki w grafie G prowadzacej z r do u. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 27 / 39
Graf G bez ujemnych cykli - własności Graf G posiada drzewo najkrótszych ścieżek wtedy i tylko wtedy, gdy G nie zawiera ujemnych cykli. Usunięcie cyklu ze ścieżki nie zwiększa jej długości. Dla każdego wierzchołka u grafu G istnieje najkrótsza ścieżka z korzenia r do wierzchołka u, która nie zawiera cykli. Suma wszystkich tych n najkrótszych ścieżek (przypomnijmy, że rozmiar zbioru wierzchołków jest oznaczany przez n) jest drzewem najkrótszych ścieżek grafu G ukorzenionego w wierzchołku r. Problem znalezienia drzewa najkrótszych ścieżek jest równoważny problemowi znalezienia odległości każdego z wierzchołków u grafu G od korzenia r 2. 2 Przez odległość od wierzchołka r do wierzchołka u w grafie G rozumiemy długość najkrótszej ścieżki w grafie G prowadzacej z r do u. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 27 / 39
Algorytm Forda-Bellmana Algorytm służy do wyznaczania najmniejszej odległości od ustalonego wierzchołka s do wszystkich pozostałych w grafie skierowanym bez cykli o ujemnej długości. Warunek nieujemności cyklu jest spowodowany faktem, że w grafie o ujemnych cyklach najmniejsza odległość między niektórymi wierzchołkami jest nieokreślona, ponieważ zależy od liczby przejść w cyklu. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 28 / 39
Algorytm Forda-Bellman Dany jest graf G = (V, E, w N) i macierz A, która dla każdej pary wierzchołków u i v zawiera wagę krawędzi (u, v) (ozn. w((u, v))). Jeśli krawędź (u, v) nie istnieje, to przyjmujemy, że jej waga wynosi nieskończoność i wpisujemy. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 29 / 39
Algorytm Forda-Bellman Dany jest graf G = (V, E, w N) i macierz A, która dla każdej pary wierzchołków u i v zawiera wagę krawędzi (u, v) (ozn. w((u, v))). Jeśli krawędź (u, v) nie istnieje, to przyjmujemy, że jej waga wynosi nieskończoność i wpisujemy. Algorytm Forda-Bellmana w każdym kroku oblicza górne oszacowanie odległości od wierzchołka r do wszystkich pozostałych wierzchołków v (ozn. d(v)). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 29 / 39
Algorytm Forda-Bellman Dany jest graf G = (V, E, w N) i macierz A, która dla każdej pary wierzchołków u i v zawiera wagę krawędzi (u, v) (ozn. w((u, v))). Jeśli krawędź (u, v) nie istnieje, to przyjmujemy, że jej waga wynosi nieskończoność i wpisujemy. Algorytm Forda-Bellmana w każdym kroku oblicza górne oszacowanie odległości od wierzchołka r do wszystkich pozostałych wierzchołków v (ozn. d(v)). W pierwszym kroku przyjmujemy d(v) = w((r, v)). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 29 / 39
Algorytm Forda-Bellman Dany jest graf G = (V, E, w N) i macierz A, która dla każdej pary wierzchołków u i v zawiera wagę krawędzi (u, v) (ozn. w((u, v))). Jeśli krawędź (u, v) nie istnieje, to przyjmujemy, że jej waga wynosi nieskończoność i wpisujemy. Algorytm Forda-Bellmana w każdym kroku oblicza górne oszacowanie odległości od wierzchołka r do wszystkich pozostałych wierzchołków v (ozn. d(v)). W pierwszym kroku przyjmujemy d(v) = w((r, v)). Gdy stwierdzimy, że d(v) > d(u)+w((u, v)), to każdorazowo polepszamy aktualne oszacowanie i podstawiamy d(v) := d(u)+w((u, v)). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 29 / 39
Algorytm Forda-Bellman Dany jest graf G = (V, E, w N) i macierz A, która dla każdej pary wierzchołków u i v zawiera wagę krawędzi (u, v) (ozn. w((u, v))). Jeśli krawędź (u, v) nie istnieje, to przyjmujemy, że jej waga wynosi nieskończoność i wpisujemy. Algorytm Forda-Bellmana w każdym kroku oblicza górne oszacowanie odległości od wierzchołka r do wszystkich pozostałych wierzchołków v (ozn. d(v)). W pierwszym kroku przyjmujemy d(v) = w((r, v)). Gdy stwierdzimy, że d(v) > d(u)+w((u, v)), to każdorazowo polepszamy aktualne oszacowanie i podstawiamy d(v) := d(u)+w((u, v)). Algorytm kończy się, gdy żadnego oszacowania nie można już poprawić. Wówczas macierz d(v) zawiera najkrótsze odległości od wierzchołka r do wszystkich pozostałych. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 29 / 39
Algorytm Forda-Bellman Require: Macierz A dla grafu G = (V, E, w : E N), wierzchołek r 1: for each v V do 2: d(v) = w((r, v)); 3: end for 4: for k := 1 to V 2 do 5: for each v V \{r} do 6: for each u V do 7: d(v) := min{d(v), d(u)+w((u, v))} 8: end for 9: end for 10: end for Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 30 / 39
Algorytm Forda-Bellman - przykład 1 2 3 4 5 6 1 0 2 4 * * * 2 * 0 * * 4 * 3 * * 0-2 3 * 4 1 * * 0 * 2 5 * * * * 0 * 6 * 2 * * 1 0 k=0 d(v) = w((1, v)). Przepisujemy pierwszy wiersz macierzy wag krawędzi. k d(1) d(2) d(3) d(4) d(5) d(6) 0 0 2 4 * * * 1 0 2 4 2a 6b 4c 2 0 2 4 2 5d 4 3 0 2 4 2 5 4 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 31 / 39
Algorytm Forda-Bellman - przykład 1 2 3 4 5 6 1 0 2 4 * * * 2 * 0 * * 4 * 3 * * 0-2 3 * 4 1 * * 0 * 2 5 * * * * 0 * 6 * 2 * * 1 0 k d(1) d(2) d(3) d(4) d(5) d(6) 0 0 2 4 * * * 1 0 2 4 2a 6b 4c 2 0 2 4 2 5d 4 3 0 2 4 2 5 4 k=0 d(v) = w((1, v)). Przepisujemy pierwszy wiersz macierzy wag krawędzi. a. W kroku k = 0, d(4) =, gdyż nie istnieje krawędź (1,4). Możemy jednak przejść przez wierzchołek 3 (odległość od 1 do 3 wynosi 4) a następnie do 4 (waga krawędzi[3, 4] = 2), długość drogi od 1 do 4 wynosi więc 4 2 = 2. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 31 / 39
Algorytm Forda-Bellman - przykład 1 2 3 4 5 6 1 0 2 4 * * * 2 * 0 * * 4 * 3 * * 0-2 3 * 4 1 * * 0 * 2 5 * * * * 0 * 6 * 2 * * 1 0 k d(1) d(2) d(3) d(4) d(5) d(6) 0 0 2 4 * * * 1 0 2 4 2a 6b 4c 2 0 2 4 2 5d 4 3 0 2 4 2 5 4 k=0 d(v) = w((1, v)). Przepisujemy pierwszy wiersz macierzy wag krawędzi. a. W kroku k = 0, d(4) =, gdyż nie istnieje krawędź (1,4). Możemy jednak przejść przez wierzchołek 3 (odległość od 1 do 3 wynosi 4) a następnie do 4 (waga krawędzi[3, 4] = 2), długość drogi od 1 do 4 wynosi więc 4 2 = 2. b. Do wierzchołka 5 możemy dojść przez 2, 3, lub 6. Wybieramy drogę o najmniejszej długości: d(2) + w(2, 5) = 2 + 4 = 6, d(3) + w(3, 5) = 4 + 3 = 7, d(6) + w(6, 5) = + 1. Wybieramy opcję z wierzchołkiem nr. 2. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 31 / 39
Algorytm Forda-Bellman - przykład 1 2 3 4 5 6 1 0 2 4 * * * 2 * 0 * * 4 * 3 * * 0-2 3 * 4 1 * * 0 * 2 5 * * * * 0 * 6 * 2 * * 1 0 k d(1) d(2) d(3) d(4) d(5) d(6) 0 0 2 4 * * * 1 0 2 4 2a 6b 4c 2 0 2 4 2 5d 4 3 0 2 4 2 5 4 k=0 d(v) = w((1, v)). Przepisujemy pierwszy wiersz macierzy wag krawędzi. a. W kroku k = 0, d(4) =, gdyż nie istnieje krawędź (1,4). Możemy jednak przejść przez wierzchołek 3 (odległość od 1 do 3 wynosi 4) a następnie do 4 (waga krawędzi[3, 4] = 2), długość drogi od 1 do 4 wynosi więc 4 2 = 2. b. Do wierzchołka 5 możemy dojść przez 2, 3, lub 6. Wybieramy drogę o najmniejszej długości: d(2) + w(2, 5) = 2 + 4 = 6, d(3) + w(3, 5) = 4 + 3 = 7, d(6) + w(6, 5) = + 1. Wybieramy opcję z wierzchołkiem nr. 2. c. Do wierzchołka 6 możemy dojść przez 4 (do którego dochodzimy przez 3) droga jest więc następująca: 1, 3, 4, 6 a jej długość wynosi d(4)+ w(4, 6) = 2 + 2 = 4. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 31 / 39
Algorytm Forda-Bellman - przykład 1 2 3 4 5 6 1 0 2 4 * * * 2 * 0 * * 4 * 3 * * 0-2 3 * 4 1 * * 0 * 2 5 * * * * 0 * 6 * 2 * * 1 0 k=0 d(v) = w((1, v)). Przepisujemy pierwszy wiersz macierzy wag krawędzi. k d(1) d(2) d(3) d(4) d(5) d(6) 0 0 2 4 * * * 1 0 2 4 2a 6b 4c 2 0 2 4 2 5d 4 3 0 2 4 2 5 4 a. W kroku k = 0, d(4) =, gdyż nie istnieje krawędź (1,4). Możemy jednak przejść przez wierzchołek 3 (odległość od 1 do 3 wynosi 4) a następnie do 4 (waga krawędzi[3, 4] = 2), długość drogi od 1 do 4 wynosi więc 4 2 = 2. b. Do wierzchołka 5 możemy dojść przez 2, 3, lub 6. Wybieramy drogę o najmniejszej długości: d(2) + w(2, 5) = 2 + 4 = 6, d(3) + w(3, 5) = 4 + 3 = 7, d(6) + w(6, 5) = + 1. Wybieramy opcję z wierzchołkiem nr. 2. c. Do wierzchołka 6 możemy dojść przez 4 (do którego dochodzimy przez 3) droga jest więc następująca: 1, 3, 4, 6 a jej długość wynosi d(4)+ w(4, 6) = 2 + 2 = 4. d. Z punktu (b.) wynika, że do wierzchołka 5 możemy dojść także poprzez wierzchołek 6. W poprzednim kroku poznaliśmy odległość do wierzchołka 6 i nie wynosi ona już nieskończoność. Zatem długość drogi do wierzchołka 5 poprzez 6: d(6)+w(6,5)=4+1=5. Jest to wartość mniejsza niż aktualna (6), więc znaleźliśmy krótsza drogę. k=3 Nic się nie zmieniło od kroku k=2. Kończymy obliczenia i mamy wektor najkrótszych dróg od wierzchołka r = 1 do wszystkich pozostałych. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 31 / 39
Algorytm Dijkstry Algorytm Dijkstry służy do wyznaczania najmniejszej odległości od ustalonego wierzchołka r do wszystkich pozostałych w grafie skierowanym. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 32 / 39
Algorytm Dijkstry Algorytm Dijkstry służy do wyznaczania najmniejszej odległości od ustalonego wierzchołka r do wszystkich pozostałych w grafie skierowanym. W odróżnieniu jednak od Algorytmu Forda-Bellmana, graf wejściowy nie może zawierać krawędzi o ujemnych wagach. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 32 / 39
Algorytm Dijkstry Algorytm Dijkstry służy do wyznaczania najmniejszej odległości od ustalonego wierzchołka r do wszystkich pozostałych w grafie skierowanym. W odróżnieniu jednak od Algorytmu Forda-Bellmana, graf wejściowy nie może zawierać krawędzi o ujemnych wagach. W algorytmie tym pamiętany jest zbiór Q wierzchołków, dla których nie obliczono jeszcze najkrótszych ścieżek, oraz wektor d[v] odległości od wierzchołka r do v. Poczatkowo zbiór Q zawiera wszystkie wierzchołki, a wektor d jest pierwszym wierszem macierzy zawierajacym wagi krawędzi. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 32 / 39
Algorytm Dijkstry - pseudokod Dopóki zbiór Q nie jest pusty wykonuj: Pobierz ze zbioru Q wierzchołek v o najmniejszej wartości d[v] i usuń go ze zbioru. Dla każdego następnika i wierzchołka v sprawdź czy d[i] > d[v]+w((v, i)), tzn. czy aktualne oszacowanie odległości do wierzchołka i jest większe od oszacowania odległości do wierzchołka v plus waga krawędzi (v, i). Jak widać z powyższego pseudokodu algorytm wybiera z kolejki Q najlżejszy wierzchołek, tzn. jest oparty o strategię zachłanna. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 33 / 39
Algorytm Dijkstry - przykład a b c d e a 0 10 * * 5 b * 0 1 * 2 c * * 0 4 * d 7 * 6 0 * e * 3 9 2 * Q d(a) d(b) d(c) d(d) d(e) {b,c,d,e} 0 10 * * 5 {b,c,d} 0 8 14 7 5 {b,c} 0 8 13 7 5 {c} 0 8 9 7 5 {} 0 8 9 7 5 Najlżejszy wierzchołek jest podkreślony. Wierzchołki, dla których wyznaczono już najkrótsze ścieżki sa pogrubione Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 34 / 39
Wyznaczanie najkrótszej drogi w grafie dla znanej odległości Algorytm służy do wyznaczania w grafie ciagu wierzchołków u s, u s+1...u t tworzacych drogę między wierzchołkami u s i u t o długości d(u s, u t ) i jest on najczęściej używany razem z algorytmem Forda-Bellmana lub Dijkstry. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 35 / 39
Wyznaczanie najkrótszej drogi w grafie dla znanej odległości Algorytm służy do wyznaczania w grafie ciagu wierzchołków u s, u s+1...u t tworzacych drogę między wierzchołkami u s i u t o długości d(u s, u t ) i jest on najczęściej używany razem z algorytmem Forda-Bellmana lub Dijkstry. Po wyznaczeniu najkrótszej odległości d(u s, u t ) między para wierzchołków w grafie, można skonstruować drogę między tymi wierzchołkami taka, że suma wag jej krawędzi jest równa d(u s, u t ), tzn. możemy wyznaczyć drogę między wierzchołkami u s i u t o najkrótszej długości. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 35 / 39
Wyznaczanie najkrótszej drogi w grafie dla znanej odległości Algorytm służy do wyznaczania w grafie ciagu wierzchołków u s, u s+1...u t tworzacych drogę między wierzchołkami u s i u t o długości d(u s, u t ) i jest on najczęściej używany razem z algorytmem Forda-Bellmana lub Dijkstry. Po wyznaczeniu najkrótszej odległości d(u s, u t ) między para wierzchołków w grafie, można skonstruować drogę między tymi wierzchołkami taka, że suma wag jej krawędzi jest równa d(u s, u t ), tzn. możemy wyznaczyć drogę między wierzchołkami u s i u t o najkrótszej długości. Załóżmy więc, że dla danego grafu opisanego za pomoca macierzy wag krawędzi wywołaliśmy algorytm wyznaczania najkrótszej odległości od ustalonego wierzchołka (u s ) do wszystkich pozostałych i w jego wyniku otrzymaliśmy wektor odległości D. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 35 / 39
Wyznaczanie najkrótszej drogi w grafie dla znanej odległości Z wektora D odczytujemy najmniejsza odległość między wierzchołkami u s i u t : D[u t ] = d(u s, u t ). Po wykonaniu poniższego algorytmu na stosie otrzymamy ciag wierzchołków u s,...,u t będacych droga między wierzchołkiem u s i u t o długości d(u s, u t ). Algorytm Require: Stos S, wierzchołki poczatkowy u s i końcowy u t 1: push(s, u t ); 2: v := u t ; 3: while v! = u s do 4: znajdź wierzchołek u taki, że D(v) = D(u)+w((u, v)); 5: push(s, u); 6: v := u; 7: end while Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 36 / 39
Przykład 1 2 3 4 5 6 1 0 2 4 * * * 2 * 0 * * 4 * 3 * * 0-2 3 * 4 1 * * 0 * 2 5 * * * * 0 * 6 * 2 * * 1 0 Jak widać z macierzy wag graf ten ma krawędzie o ujemnych wagach, musimy więc zastosować algorytm Forda-Bellmana. W wyniku jego działania otrzymamy wektor d postaci: D[1] = 0, D[2] = 2, D[3] = 4, D[4] = 2, D[5] = 5, D[6] = 4. Załóżmy że wierzchołkiem, względem którego wyznaczać będziemy najkrótsza drogę jest wierzchołek o indeksie 1. Dlatego też D[1] = 0. Musimy też wybrać wierzchołek końcowy niech będzie to wierzchołek nr. 5. Z wektora D odczytujemy najmniejsza odległość między wierzchołkami 1 i 5, tj. D[5] = d(1, 5) = 5. Wyznaczamy drogę łacz ac a wierzchołek 1 i 5 o długości równej 5. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 37 / 39
Przykład, cd. Po wykonaniu pierwszej linii algorytmu otrzymamy anstępujace parametry: Stos = {5}, v = 5, D[v] = 5, u =?, D[u]+w((u, v)) =?. Poszukujemy teraz wierzchołka u. Sprawdzamy wartości D[u]+w((u, v)) tylko dla tych wierzchołków u, które sa poprzednikami wierzchołka v. W naszym przypadku poprzednikami wierzchołka 5 sa wierzchołki 2, 3 i 6. Sprawdzamy więc: D[2]+w((2, 5)) = 2+4 = 6! = D[5], D[3]+w((3, 5)) = 4+3 = 7! = D[5], oraz D[6]+w((6, 5)) = 4+1 = 5 = D[5]. Znaleźliśmy wierzchołek u = 6, wykonujemy zatem instrukcje 5 i 6 algorytmu: Stos = {5, 6}, v = 6, D[v] = 4, u =?, D[u]+w((u, v)) =?. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 38 / 39
Przykład, cd. Tym razem nie mamy zbyt dużego wyboru, gdyż jedynym poprzednikiem wierzchołka nr. 6 jest 4. A więc D[4]+w((4, 6)) = 2+2 = 4 = d[6], zatem m = 4. Dalej algorytm przebiega podobnie: Stos = {5, 6, 4}, v = 4, D[v] = 2, u = 3, D[u]+w((u, v)) = 4+( 2) = 4. Stos = {5, 6, 4, 3}, v = 3, D[v] = 4, u = 1, D[u]+w((u, v)) = 0+4 = 4. Tu algorytm się kończy, gdyż w następnej iteracji v = 1. A zatem droga między wierzchołkiem 1 i 5 o długości 5 jest następujaca: (1, 3, 4, 6, 5). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 8 39 / 39