Algorytmy i Struktury Danych. Grafy dr hab. Bożena Woźna-Szcześniak [email protected] 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˛ krawedź ˛ grafu dokładnie jeden raz. Warunkiem istnienia ścieżki sa: ˛ 1 2 3 spójność grafu. 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. dla grafu nieskierowanego z każdego wierzchołka, za wyjatkiem ˛ dwóch, musi wychodzić parzysta liczba krawedzi. ˛ Graf, który posiada ścieżk˛e 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 bez ścieżki Eulera: Graf ze ścieżka˛ Eulera: Ścieżka: 1-> ABCDE -> 3 Bożena Woźna-Szcześniak (AJD) Nie spełniony warunek 3 istnienia ścieżki Eulera Algorytmy i Struktury Danych. Wykład 9 4 / 53 Cykl Eulera Cykl Eulera to taki cykl w grafie, który zawiera każda˛ krawedź ˛ 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 krawedzi. ˛ 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: Cykl 2: Cykl 3: Cykl 4: 1-> ABCDEF -> 1 1-> ABEDCF -> 1 1-> FCDEBA -> 1 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˛ krawedź ˛ grafu, której usuniecie ˛ zwieksza ˛ liczbe˛ 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 sie˛ na prostej zasadzie: aby znaleźć cykl Eulera lub ścieżk˛e Eulera, mosty sa˛ ostatnimi krawedziemi, ˛ które nalezy przejść. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 10 / 53 Algorytm Fleury’ego Warunek wstepny: ˛ 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 wystepujacego ˛ w cz˛eś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: Bożena Woźna-Szcześniak (AJD) Wybieramy wierzchołek F jak startowy 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˛e 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 droge˛ 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 droge˛ 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 droge˛ 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 droge˛ 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 droge˛ 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 droge, ˛ droge˛ 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 droge˛ 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 droge˛ 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ł nastepuj ˛ acy ˛ problem: Listonosz roznoszac ˛ listy musi przejść przez wszystkie ulice w swojej dzielnicy co najmniej jeden raz i wrócić na poczte. ˛ Ponieważ jest człowiekiem leniwym, chciałby mieć jak najkrótsza˛ do przejścia trase. ˛ 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 strukture˛ 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 krawedziami. ˛ 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 u 3 Pytanie: Czy najkrótsza ścieżka pomiedzy ˛ wierzchołkami u i v może zawierać cykl? 2 2 1 1 3 -3 1 1 v Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 36 / 53 Etykietowany graf skierowany - przykład u 3 Pytanie: Czy najkrótsza ścieżka pomiedzy ˛ wierzchołkami u i v może zawierać cykl? 2 2 1 1 3 -3 1 1 v Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. 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. 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ć usuniete ˛ 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 Źródło: http://logistyka.math. akademii Nauki i Sztuki. Wiecej ˛ na http://en. wikipedia.org/wiki/ Richard_E._Bellman Bożena Woźna-Szcześniak (AJD) uni.lodz.pl/Bellman.jpeg 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 ˛ sie˛ w algorytmach przepływu w sieci Autor algorytmu Bellmana-Forda do znajdowania najkrótszej ścieżki w grafach, które posiadaja˛ krawedzie ˛ z ujemnymi wagami. Bożena Woźna-Szcześniak (AJD) Źródło:http: //arodrigu.webs.upv.es/ 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ść miedzy ˛ 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 wage˛ krawedzi ˛ (u, v ) (ozn. w((u, v ))). Jeśli krawedź ˛ (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 wage˛ krawedzi ˛ (u, v ) (ozn. w((u, v ))). Jeśli krawedź ˛ (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 wage˛ krawedzi ˛ (u, v ) (ozn. w((u, v ))). Jeśli krawedź ˛ (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 wage˛ krawedzi ˛ (u, v ) (ozn. w((u, v ))). Jeśli krawedź ˛ (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 wage˛ krawedzi ˛ (u, v ) (ozn. w((u, v ))). Jeśli krawedź ˛ (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 sie, ˛ 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 * * 1 * * 2 2 0 * * * 2 3 4 * 0 * * * 4 * * -2 0 * * 5 * 4 3 * 0 1 6 * * * 2 * 0 k 0 1 2 3 d(1) 0 0 0 0 d(2) 2 2 2 2 d(3) 4 4 4 4 d(4) * 2a 2 2 d(5) * 6b 5d 5 d(6) * 4c 4 4 k=0 d(v ) = w((1, v )). Przepisujemy pierwszy wiersz macierzy wag krawedzi. ˛ 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 * * 1 * * 2 2 0 * * * 2 3 4 * 0 * * * 4 * * -2 0 * * 5 * 4 3 * 0 1 6 * * * 2 * 0 k 0 1 2 3 d(1) 0 0 0 0 d(2) 2 2 2 2 d(3) 4 4 4 4 d(4) * 2a 2 2 d(5) * 6b 5d 5 d(6) * 4c 4 4 k=0 d(v ) = w((1, v )). Przepisujemy pierwszy wiersz macierzy wag krawedzi. ˛ a. W kroku k = 0, d(4) = ∗, gdyż nie istnieje krawedź ˛ (1,4). Możemy jednak przejść przez wierzchołek 3 (odległość od 1 do 3 wynosi 4) a nastepnie ˛ do 4 (waga krawedzi ˛ [3, 4] = −2), długość drogi od 1 do 4 wynosi wiec ˛ 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 * * 1 * * 2 2 0 * * * 2 3 4 * 0 * * * 4 * * -2 0 * * 5 * 4 3 * 0 1 6 * * * 2 * 0 k 0 1 2 3 d(1) 0 0 0 0 d(2) 2 2 2 2 d(3) 4 4 4 4 d(4) * 2a 2 2 d(5) * 6b 5d 5 d(6) * 4c 4 4 k=0 d(v ) = w((1, v )). Przepisujemy pierwszy wiersz macierzy wag krawedzi. ˛ a. W kroku k = 0, d(4) = ∗, gdyż nie istnieje krawedź ˛ (1,4). Możemy jednak przejść przez wierzchołek 3 (odległość od 1 do 3 wynosi 4) a nastepnie ˛ do 4 (waga krawedzi ˛ [3, 4] = −2), długość drogi od 1 do 4 wynosi wiec ˛ 4 − 2 = 2. b. Do wierzchołka 5 możemy dojść przez 2, 3, lub 6. Wybieramy droge˛ 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 opcje˛ 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 * * 1 * * 2 2 0 * * * 2 3 4 * 0 * * * 4 * * -2 0 * * 5 * 4 3 * 0 1 6 * * * 2 * 0 k 0 1 2 3 d(1) 0 0 0 0 d(2) 2 2 2 2 d(3) 4 4 4 4 d(4) * 2a 2 2 d(5) * 6b 5d 5 d(6) * 4c 4 4 k=0 d(v ) = w((1, v )). Przepisujemy pierwszy wiersz macierzy wag krawedzi. ˛ a. W kroku k = 0, d(4) = ∗, gdyż nie istnieje krawedź ˛ (1,4). Możemy jednak przejść przez wierzchołek 3 (odległość od 1 do 3 wynosi 4) a nastepnie ˛ do 4 (waga krawedzi ˛ [3, 4] = −2), długość drogi od 1 do 4 wynosi wiec ˛ 4 − 2 = 2. b. Do wierzchołka 5 możemy dojść przez 2, 3, lub 6. Wybieramy droge˛ 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 opcje˛ z wierzchołkiem nr. 2. c. Do wierzchołka 6 możemy dojść przez 4 (do którego dochodzimy przez 3) droga jest wiec ˛ nastepuj ˛ aca: ˛ 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 * * 1 * * 2 2 0 * * * 2 3 4 * 0 * * * 4 * * -2 0 * * 5 * 4 3 * 0 1 6 * * * 2 * 0 k 0 1 2 3 d(1) 0 0 0 0 d(2) 2 2 2 2 d(3) 4 4 4 4 d(4) * 2a 2 2 d(5) * 6b 5d 5 d(6) * 4c 4 4 k=0 d(v ) = w((1, v )). Przepisujemy pierwszy wiersz macierzy wag krawedzi. ˛ a. W kroku k = 0, d(4) = ∗, gdyż nie istnieje krawedź ˛ (1,4). Możemy jednak przejść przez wierzchołek 3 (odległość od 1 do 3 wynosi 4) a nastepnie ˛ do 4 (waga krawedzi ˛ [3, 4] = −2), długość drogi od 1 do 4 wynosi wiec ˛ 4 − 2 = 2. b. Do wierzchołka 5 możemy dojść przez 2, 3, lub 6. Wybieramy droge˛ 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 opcje˛ z wierzchołkiem nr. 2. c. Do wierzchołka 6 możemy dojść przez 4 (do którego dochodzimy przez 3) droga jest wiec ˛ nastepuj ˛ aca: ˛ 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), wiec ˛ znaleźliśmy krótsza˛ droge. ˛ k=3 Nic sie˛ 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ć krawedzi ˛ 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ć krawedzi ˛ o ujemnych wagach. W algorytmie tym pamietany ˛ 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 krawedzi. ˛ 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 nastepnika ˛ 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 wieksze ˛ od oszacowania odległości do wierzchołka v plus waga krawedzi ˛ (v , i). Jak widać z powyższego pseudokodu algorytm wybiera z kolejki Q “najlżejszy” wierzchołek, tzn. jest oparty o strategie˛ 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 * * 7 * b 10 0 * * 3 c * 1 0 6 9 d * * 4 0 2 e 5 2 * * * Q {b,c,d,e} {b,c,d} {b,c} {c} {} d(a) 0 0 0 0 0 d(b) 10 8 8 8 8 d(c) * 14 13 9 9 d(d) * 7 7 7 7 d(e) 5 5 5 5 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 us , us+1 . . . ut tworzacych ˛ droge˛ miedzy ˛ wierzchołkami us i ut o długości d(us , ut ) i jest on najcz˛eś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 us , us+1 . . . ut tworzacych ˛ droge˛ miedzy ˛ wierzchołkami us i ut o długości d(us , ut ) i jest on najcz˛eściej używany razem z algorytmem Forda-Bellmana lub Dijkstry. Po wyznaczeniu najkrótszej odległości d(us , ut ) miedzy ˛ para˛ wierzchołków w grafie, można skonstruować droge˛ miedzy ˛ tymi wierzchołkami taka, ˛ że suma wag jej krawedzi ˛ jest równa d(us , ut ), tzn. możemy wyznaczyć droge˛ miedzy ˛ wierzchołkami us i ut 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 us , us+1 . . . ut tworzacych ˛ droge˛ miedzy ˛ wierzchołkami us i ut o długości d(us , ut ) i jest on najcz˛eściej używany razem z algorytmem Forda-Bellmana lub Dijkstry. Po wyznaczeniu najkrótszej odległości d(us , ut ) miedzy ˛ para˛ wierzchołków w grafie, można skonstruować droge˛ miedzy ˛ tymi wierzchołkami taka, ˛ że suma wag jej krawedzi ˛ jest równa d(us , ut ), tzn. możemy wyznaczyć droge˛ miedzy ˛ wierzchołkami us i ut o najkrótszej długości. Załóżmy wiec, ˛ że dla danego grafu opisanego za pomoca˛ macierzy wag krawedzi ˛ wywołaliśmy algorytm wyznaczania najkrótszej odległości od ustalonego wierzchołka (us ) 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ść miedzy ˛ wierzchołkami us i ut : D[ut ] = d(us , ut ). Po wykonaniu poniższego algorytmu na stosie otrzymamy ciag ˛ wierzchołków us , . . . , ut bed ˛ acych ˛ droga˛ miedzy ˛ wierzchołkiem us i ut o długości d(us , ut ). Algorytm Require: Stos S, wierzchołki poczatkowy ˛ us i końcowy ut 1: push(S, ut ); 2: v := ut ; 3: while v ! = us 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 * * 1 * * 2 2 0 * * * 2 3 4 * 0 * * * 4 * * -2 0 * * 5 * 4 3 * 0 1 Bożena Woźna-Szcześniak (AJD) 6 * * * 2 * 0 Jak widać z macierzy wag graf ten ma krawedzie ˛ o ujemnych wagach, musimy wiec ˛ 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, wzgledem ˛ którego wyznaczać bedziemy ˛ najkrótsza˛ droge˛ jest wierzchołek o indeksie 1. Dlatego też D[1] = 0. Musimy też wybrać wierzchołek końcowy – niech bedzie ˛ to wierzchołek nr. 5. Z wektora D odczytujemy najmniejsza˛ odległość miedzy ˛ wierzchołkami 1 i 5, tj. D[5] = d(1, 5) = 5. Wyznaczamy droge˛ łacz ˛ ac ˛ a˛ wierzchołek 1 i 5 o długości równej 5. Algorytmy i Struktury Danych. Wykład 9 51 / 53 Przykład, cd. Po wykonaniu pierwszej linii algorytmu otrzymamy anstepuj ˛ ace ˛ 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 wiec: ˛ 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 wiec ˛ 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 sie˛ kończy, gdyż w nastepnej ˛ iteracji v = 1. A zatem droga miedzy ˛ wierzchołkiem 1 i 5 o długości 5 jest nastepuj ˛ aca: ˛ (1, 3, 4, 6, 5). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 53 / 53