Algorytmy i Struktury Danych. Grafy dr hab. Bożena Woźna-Szcześniak bwozna@gmail.com Jan Długosz University, Poland Wykład 9 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 1 / 53
Plan wykładu Ścieżka Eulera Cykle Eulera Algorytm Bellmana-Forda Algorytm Dijkstry Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 2 / 53
Ścieżka Eulera Ścieżka Eulera w grafie (skierowanym), to ścieżka (droga) prosta, która zawiera każda krawędź grafu dokładnie jeden raz. Warunkiem istnienia ścieżki sa: 1 spójność grafu. 2 dla grafu skierowanego należy sprawdzić, czy dla każdego wierzchołka, za wyjatkiem dwóch, stopień wyjściowy jest równy stopniu wejściowemu. 3 dla grafu nieskierowanego z każdego wierzchołka, za wyjatkiem dwóch, musi wychodzić parzysta liczba krawędzi. Graf, który posiada ścieżkę Eulera nazywamy grafem półeulerowskim Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 3 / 53
Ścieżka Eulera - przykład Graf ze ścieżka Eulera: Graf bez ścieżki Eulera: Ścieżka: 1-> ABCDE -> 3 Nie spełniony warunek 3 istnienia ścieżki Eulera Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 4 / 53
Cykl Eulera 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 nazywamy grafem eulerowskim Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 5 / 53
Ścieżka Eulera - przykład Graf bez cyklu Eulera: Graf z cyklem Eulera: Cykl 1: 1-> ABCDEF -> 1 Cykl 2: 1-> ABEDCF -> 1 Cykl 3: 1-> FCDEBA -> 1 Cykl 4: 1-> FEDCBA -> 1 Nie spełniony warunek 3 istnienia cyklu Eulera Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 6 / 53
Zagadki Sprawdź, w którym z poniższych grafów istnieje cykl lub droga Eulera. Jeśli w grafie istnieje cykl lub droga Eulera, to można ja narysować nie odrywajac ołówka od papieru. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 7 / 53
Twierdzenie Eulera, 1736 Twierdzenie Spójny graf G (nieskierowany) ma cykl Eulera wtedy i tylko wtedy, gdy stopień każdego wierzchołka w G jest parzysty. Leonhard Euler (1707 1783) Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 8 / 53
Most Mostem nazywamy taka krawędź grafu, której usunięcie zwiększa liczbę spójnych składowych tego grafu. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 9 / 53
Wyznaczanie cyklu Eulera Do wyznaczania syklu Eulera słuzy algorytm Fleury ego Algorytm działa zarówno dla grafów skierowanych jak i nieskierowanych. Algorytm jest rekurencyjny Algorytm zakłada, że graf jest eulerowski. Algorytm Fleury ego opiera się na prostej zasadzie: aby znaleźć cykl Eulera lub ścieżkę Eulera, mosty sa ostatnimi krawędziemi, które nalezy przejść. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 10 / 53
Algorytm Fleury ego Warunek wstępny: Wejściowy graf jest grafem eulerowskim, czyli: jest spójny w przypadku poszukiwania ścież Eulera - posiada co najwyżej dwa wierzchołki o nieparzystym stopniu w przypadku poszukiwania cyklu Eulera - wszytkie wierzchołki musza mieć parzysty stopień Warunek startowy: W przypadku cyklu: wybierz dowolny wierzchołek W przypadku ścieżki: wybierz jeden z wierzchołków nieparzystych Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 11 / 53
Algorytm Fleury ego Kroki pośrednie: Na każdym kroku, jeśli jest wybór, nie wybieraj mostu występujacego w części grafu, która nie została jeszcze odwiedzona. Jednakże, jeśli jest tylko jeden wybór, to weź go. Warunek Końcowy: Kiedy nie można przechodzić już dalej, cykl (ścieżka) jest kompletna. [W przypadku cyklu, wracamy do wierzchołka wyjściowego; w przypadku ścieżki dochodzimy do drugiego wierzchołka o nieparzystym stopniu.] Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 12 / 53
Algorytm Fleury ego Graf eulerowski: Wybieramy wierzchołek F jak startowy Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 13 / 53
Algorytm Fleury ego Idziemy z F do C Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 14 / 53
Algorytm Fleury ego Idziemy z C do D Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 15 / 53
Algorytm Fleury ego Idziemy z D do A. (Można również iść z D do B, ale nie można z D do F, bo DF jest mostem) Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 16 / 53
Algorytm Fleury ego Idziemy z A do C. (Można również iść z A do E, ale nie można z A do B, bo AB jest mostem) Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 17 / 53
Algorytm Fleury ego Idziemy z C do E. Nie ma wyboru. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 18 / 53
Algorytm Fleury ego Idziemy z E do A. Nie ma wyboru. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 19 / 53
Algorytm Fleury ego Idziemy z A do B, potem z B do D i na koniec z D do F. Jednoznaczna ściezka. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 20 / 53
Algorytm Fleury ego Kolejne kroki algorytmu - podsumowanie. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 21 / 53
Algorytm Fleury ego Dany jest graf półeulerowski. Znaleźć ścieżkę Eulera. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 22 / 53
Algorytm Fleury ego Możemy wystartować z wierzchołka J lub wierzcholka E. Startujemy z wierzchołka J. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 23 / 53
Algorytm Fleury ego Z wierzchołka J mamy 5 możliwych dróg. Wszystkie sa OK. Wybieramy drogę do wierzchołka K Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 24 / 53
Algorytm Fleury ego Z wierzchołka K mamy 3 możliwe drogi. Wszystkie sa OK. Wybieramy drogę do wierzchołka B. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 25 / 53
Algorytm Fleury ego Z wierzchołka B mamy 3 możliwe drogi. Wszystkie sa OK. Wybieramy drogę do wierzchołka C. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 26 / 53
Algorytm Fleury ego Z wierzchołka C mamy 3 możliwe drogi. Wszystkie sa OK. Wybieramy drogę do wierzchołka L. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 27 / 53
Algorytm Fleury ego Z wierzchołka L mamy 3 możliwe drogi. Wszystkie sa OK. Wybieramy drogę do wierzchołka K. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 28 / 53
Algorytm Fleury ego Z wierzchołka K mamy tylko 1 drogę, drogę do wierzchołka H. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 29 / 53
Algorytm Fleury ego Z wierzchołka H mamy 3 możliwe drogi: do G, I oraz J. Nie możemy wybrać drogi z H do G, bo jest mostem. Pozostałe dwie sa Ok. Wybieramy drogę do wierzchołka J. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 30 / 53
Algorytm Fleury ego Z wierzchołka J mamy 3 możliwe drogi: do A, B oraz I. Nie możemy wybrać drogi z J do I, bo jest mostem. Pozostałe dwie sa Ok. Wybieramy drogę do wierzchołka B. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 31 / 53
Algorytm Fleury ego Z wierzchołka B do wierzcholka G prowadzi jednoznaczna droga poprzez wierzcholki A, J, I oraz H. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 32 / 53
Algorytm Fleury ego Z wierzchołka G do wierzcholka E prowadzi wiele dróg. Oto jedna z nich: z G do F, potem do E, potem do D, potem do C, potem do E, potem do G, potem do L i na końcu do E. INNA DROGE PROSZE odnaleźć jako ćwiczenie!!! Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 33 / 53
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 9 34 / 53
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 9 35 / 53
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 9 36 / 53
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 9 36 / 53
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 9 37 / 53
Czy najkrótsza ścieżka zawsze istnieje? Raczej nie... Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 38 / 53
Drzewo najkrótszych ścieżek Graf G posiada drzewo najkrótszych ścieżek wtedy i tylko wtedy, gdy G nie zawiera ujemnych cykli. 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 najkrótszych ścieżek jest drzewem najkrótszych ścieżek grafu G ukorzenionego w wierzchołku r. 1 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 9 39 / 53
Drzewo najkrótszych ścieżek Graf G posiada drzewo najkrótszych ścieżek wtedy i tylko wtedy, gdy G nie zawiera ujemnych cykli. 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 najkrótszych ścieżek 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 1. 1 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 9 39 / 53
Richard Ernest Bellman - (26.08.1920-19.03.1984) Twórca programowania dynamicznego (Dynamic Programming 1957) W 1979 roku otrzymał IEEE Medal of Honor za wkład w teorie sterowania i procesów decyzyjnych, szczególnie za stworzenie i zastosowanie programowania dynamicznego. 1975 - Członek amerykańskiej akademii Nauki i Sztuki. Więcej na http://en. wikipedia.org/wiki/ Richard_E._Bellman Źródło: http://logistyka.math. uni.lodz.pl/bellman.jpeg Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 40 / 53
Lester Randolph Ford, junior (ur. 23.09.1927) Syn matematyka Lester R. Forda, seniora Amerykański matematyk specjalizujacy się w algorytmach przepływu w sieci Autor algorytmu Bellmana-Forda do znajdowania najkrótszej ścieżki w grafach, które posiadaja krawędzie z ujemnymi wagami. Źródło:http: //arodrigu.webs.upv.es/ Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 41 / 53
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 9 42 / 53
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 9 43 / 53
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 9 43 / 53
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 9 43 / 53
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 9 43 / 53
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 9 43 / 53
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 9 44 / 53
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 9 45 / 53
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 9 45 / 53
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 9 45 / 53
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ępujaca: 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 9 45 / 53
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ępujaca: 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 9 45 / 53
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 9 46 / 53
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 9 46 / 53
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 9 46 / 53
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 9 47 / 53
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 9 48 / 53
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 9 49 / 53
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 9 49 / 53
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 9 49 / 53
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 9 50 / 53
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 9 51 / 53
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 9 52 / 53
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 9 53 / 53