Grafy skierowane
Transkrypt
Grafy skierowane
Matematyka Dyskretna Andrzej Szepietowski 25 czerwca 2002 roku Rozdział 1 Grafy skierowane W tym rozdziale zajmiemy siȩ algorytmami wyszukiwania najkrótszej drogi w grafach skierowanych. Każdej krawȩdzi przypiszemy długość (wagȩ) i algorytmy bȩda̧ szukać drogi, dla której suma długości krawȩdzi jest najmniejsza. 1.1 Grafy skierowane Definicja 1.1 Graf skierowany (zorientowany) to dowolna para nym zbiorem wierzchołków i zbiorem krawȩdzi . , ze skończo- Rysunek 1.1: Graf skierowany W grafie skierowanym krawȩdź jest skierowana od wierzchołka do wierzchołka . Wierzchołek nazywamy pocza̧tkiem krawȩdzi, a wierzchołek ko ńcem. Na rysunkach krawȩdzie skierowane bȩdziemy przedstawiać jako strzałki. Droga w grafie skierowanym jest to cia̧g wierzchołków , taki, że dla każdego , wierzchołki , sa̧ poła̧czone krawȩdzia̧, czyli . Drogȩ nazywamy cyklem jeżeli , oraz wszystkie wierzchołki sa̧ różne. Na przykład cia̧g wierzchołków jest cyklem w grafie z rysunku 1.1. Dla grafów skierowanych dopuszczamy cykl złożony z dwóch wierzchołków, na przykład cia̧g stanowi cykl w grafie z rysunku 1.1. Krawȩdź typu , w której pocza̧tek i koniec pokrywaja̧ siȩ, nazywamy pȩtla̧. Można przyja̧ć, że pȩtla jest cyklem długości jeden. 3 /01! "/ !"$#%#$#& ' *),+ +.2/01!" "/3546 7( 8 !9%#$( #%#$ ' ":;' 8!"$#$#%#& ' 2< 1 4 Rozdział 1. Grafy skierowane Definicja 1.2 Graf skierowany jest (silnie) spójny, jeżeli dla każdych dwóch jego wierzchołków i istnieje droga z do . Przykład 1.3 Graf z rysunku 1.1 nie jest spójny, bo nie ma w nim drogi z do . 1.2 Najkrótsze drogi w grafie Przypuśćmy teraz, że każdej krawȩdzi przypisano długość (wagȩ) przy tym ujemne długości. Dla każdej drogi w grafie . Dopuszczamy 7%#$#$#% zdefiniujmy jej długość jako sumȩ długości krawȩdzi, czyli /! 2"/01!" "/3 # Jeżeli , droga składa siȩ z pojedynczego punktu, to przyjmujemy, że jej długość wynosi 0. W tym rozdziale interesuja̧ nas algorytmy wyznaczania najkrótszej drogi ła̧cza̧cej dwa wierzchołki i w grafie. Przykład 1.4 Jako przykład zastosowania algorytmu wyszukiwania najkrótszej drogi w grafie rozpatrzmy sieć poła̧czeń, czyli graf, w którym krawȩdzie reprezentuja̧ ła̧cza pomiȩdzy wȩzłami. Z każda̧ krawȩdzia̧ zwia̧zane jest prawdopodobieństwo , że krawȩdź zadziała bez awarii. Zakładamy, że awarie poszczególnych krawȩdzi sa̧ od siebie niezależne. Przyjmijmy teraz długość krawȩdzi jako . Najkrótsza droga jest wtedy droga̧ z najmniejszym prawdopodobieństwem awarii. Łatwo zauważyć, że jeżeli w grafie sa̧ cykle o ujemnej długości, to dla pewnych par wierzchołków nie istnieje najkrótsza droga miȩdzy nimi. Powtarzaja̧c przejście wzdłuż cyklu można wtedy otrzymywać drogi o długości dowolnie małej. Dlatego w dalszej czȩści bȩdziemy zakładać, że w grafie wszystkie cykle sa̧ dodatniej długości. Problem znajdowania najkrótszej drogi w grafie nieskierowanym, jeżeli wszystkie krawȩdzie maja̧ dodatnie długości, można sprowadzić do przypadku grafu skierowanego. Wystarczy każda̧ krawȩdź zasta̧pić przez dwie krawȩdzie i . Jeżeli w grafie sa̧ krawȩdzie o ujemnych długościach, to sposób ten prowadzi do powstania cykli ujemnej długości. Opisane tu algorytmy składaja̧ siȩ z dwóch etapów. W pierwszym etapie wyznaczamy długości najkrótszych dróg z do wszystkich wierzchołków w grafie. A dopiero w drugim etapie wyznaczymy najkrótsza̧ drogȩ z do . Najpierw opiszemy drugi etap, czyli jak znaleźć najkrótsza̧ drogȩ z do , jeżeli znane sa̧ odległości z do wszystkich wierzchołków grafu. Algorytm ten bȩdziemy opisywać przy pomocy przykładu grafu z rysunku 1.2. Dla prostoty algorytmu przyjmujemy , jeżeli . Załóżmy, że macierz zawiera odległości od do wszystkich pozostałych wierzchołków grafu. < 2< 2< , 4 1.3. Algorytm Forda-Bellmana ) 5 Rysunek 1.2: Graf z długościami krawȩdzi ) v s 0 a 1 b 0 c -1 d 1 t 2 od , czyli długość najkrótszej drogi z do . Przyjmujemy zawiera odległość , jeżeli nie ma żadnej drogi z do . Najkrótsza̧ przy tym, że oraz drogȩ od do wyznaczamy teraz od końca. Najpierw szukamy przedostatniego wierzchołka tej drogi, później trzeciego od końca i tak dalej. Przedostatni wierzchołek najkrótszej drogi spełnia równość 2 # , 2< i tak dalej, aż odtworzymy cała̧ drogȩ . W naszym przykładzie jest to W naszym przykładzie tylko wierzchołek spełnia ta̧ równość. Zauważmy, że isnieje , to otrzymamy droga długości z do . Jeżeli przedłużymy tȩ drogȩ o krawȩdź drogȩ z do długości , czyli najkrótsza̧ drogȩ z do . Jest też jasne, że taki wierzchołek istnieje. Jest to przedostatni wierzchołek dowolnej najkrótszej drogi z do . Trzeci od końca wierzchołek spełnia równość Algorytm ten musi zakończyć pracȩ, ponieważ kolejne wierzchołki odsłanianej drogi sa̧ różne. Inaczej mielibyśmy cykl, co nie jest możliwe, jeżeli w grafie wszystkie cykle sa̧ dodatniej długości. 1.3 Algorytm Forda-Bellmana W tym podrozdziale opiszemy pierwszy z algorytmów obliczania wartości macierzy . Mówia̧c z grubsza polega on na przyjȩciu najpierw pewnych górnych oszacowa ń na wartości i poprawianiu ich potem. Jeżeli na jakimś etapie pracy algorytmu mamy wartość , to znaczy, że znaleziono już drogȩ od do długości . Jeżeli później algorytm znajdzie krótsza̧ drogȩ, to wartość zostanie poprawiona. Znajdowanie krotszej drogi polega na szukaniu wierzchołka spełniaja̧cego warunek 3# 6 Rozdział 1. Grafy skierowane Algorytm [Forda-Bellmana] , długości krawȩdzi Dane wejściowe: Graf skierowany Dane wyjściowe: Macierz odległości z do wszystkich wierzchołków. dla każdego podstaw ; dla każdego od 1 do zrób: . 4 dla każdego zrób: 4 zrób: ( 2< dla każdego . Jest to pierwsze Algorytm Forda-Bellmana najpierw podstawia 4 algorytm sprawdza, przybliżenie. Potem w rundach, dla każdego wierzchołka czy istnieje wierzchołek , który wyznacza krótsza̧ drogȩ do . Przykład 1.5 Algorytm Forda-Bellmana zastosowany do grafu z rysunku 1.2 działa w nastȩpuja̧cy sposób: Na pocza̧tku macierz przedstawia siȩ nastȩpuja̧co: v s 0 a b 2 c 2 d 1 t - ) 6 ) , )5 ) ) ) : 5 ) W pierwszej iteracji zewnȩtrznej pȩtli, dla , algorytm dla każdego wierzchołka sprawdza, czy istnieje wierzchołek , przez który wiedzie krótsza droga do . I tak dla , stwierdza, . Oznacza, to, że droga z do a potem krawȩdzia̧ do jest krótsza od dotychczasowego oszacowania . . Dla wartość nie zmienia siȩ Dlatego algorytm podstawia 3 na ponieważ droga przez nie jest krótsza od dotychczasowego oszacowania. Dla algorytm znajduje krótsza̧ drogȩ przez ; i zmienia na . Dla wartość macierzy nie jest algorytm odnajduje drogȩ przez , korygowana, a dla i posyła . Tak wiȩc po pierwszej iteracji pȩtli macierz ma nastȩpuja̧ce wartości: v s 0 a 3 b 2 c -1 d 1 t 4 b 0 c -1 d 1 t 4 - tylko wartość zostaje poprawiona, gdyż ) ) . Nowa . Pozostałe wartości nie zmieniaja̧ siȩ i wartość W drugiej iteracji dla po drugiej iteracji macierz wygla̧da tak v ) - s 0 a 3 W trzeciej iteracji pȩtli dla algorytm najpierw znajduje krótsza̧ drogȩ do (przez ) i poprawia , a potem znajduje krótsza̧ drogȩ do (przez ) i poprawia . Po trzeciej iteracji macierz wygla̧da tak v s 0 a 1 b 0 c -1 d 1 t 2 1.4. Dodatnie długości, algorytm Dijsktry 7 Jest to ostateczna postać macierzy, gdyż w czwartej iteracji jej wartości nie sa̧ już poprawione. ( Aby udowodnić, że algorytm działa poprawnie pokażemy przez indukcjȩ, że po -tej iteracji zewnȩtrznej pȩtli zawiera długość najkrótszej drogi z do zawieraja̧cej co najwyżej krawȩdzi. Przed pierwsza̧ iteracja̧ zawiera długość drogi złożonej z jednej lub zero krawȩdzi. Załóżmy, że po iteracjach zawiera długość najkrótszej drogi z lub mniej krawȩdziami. Przypuśćmy, że jest najkrótsza̧ spośród dróg z do z lub mniej krawȩdziami. Droga jestnajkrótsza̧ droga̧ do z lub mniej krawȩdziami. Gdyby istniała krótsza droga do z co najwyżej krawȩdziami, to mielibyśmy krótsza̧ drogȩ do z co najwyżej krawȩdziami; sprzeczność. Czyli długość drogi jest równa po tej iteracji. Dlatego po iteracji bȩdzie zawierać długość najkrótszej drogi do z krawȩdziami. Po zakończeniu pracy algorytmu zawiera długość najkrótszej drogi z do , ponieważ, jeżeli w grafie wszystkie cykle sa̧ dodatniej długości, to w minimalnej drodze żaden wierzchołek nie powtarza siȩ i droga nie zawiera wiȩcej niż krawȩdzi. Algorytm zawiera trzy pȩtle zagnieżdżone jedna w druga̧. Zewnȩtrzna pȩtla wykonuje siȩ razy. Dla każdego wewnȩtrzna pȩtla wykonuje siȩ razy, raz dla każdego , a dla każdego mamy wykonań najbardziej wewnȩtrznej pȩtli, czyli czas , gdzie i to działania algorytmu można oszacować przez stałe. Tak wiȩc złożoność czasowa algorytmu wynosi . ( ) ( ) ( ( %#$#$#% ! ! ( ) ( ( ) %#$#$#$ ! ( ) ) $ )9 + ! ( ( 4 $#%#$#$ ! ! ) 1.4 Dodatnie długości, algorytm Dijsktry W tym podrozdziale podamy algorytm znajdowania odległości od źródła do wszystkich wierzchołków grafu dla przypadku, gdy długości wszystkich krawȩdzi sa̧ dodatnie. Algorytm Dijkstry Dane wejściowe: Graf skierowany , dodatnie długości krawȩdzi . Dane wyjściowe: Macierz odległości z do wszystkich wierzchołków. dla każdego podstaw ; dopóki 4 powtarzaj: 4 3 2< podstaw wybierz wierzchołek ; dla każdego 4 4 taki, że 8 Rozdział 1. Grafy skierowane 1 4 4 Podobnie jak w poprzednim algorytmie na pocza̧tku macierz zawiera długość krawȩdzi , a jeżeli takiej krawȩdzi nie ma, to . Zbiór zawiera wierzchołki, dla których nie jest jeszcze wyliczona dokładna odległość od . Poniżej pokażemy, że dla , zawiera długość najkrótszej spośród dróg, której przedostatni wierzchołek należy do . Nastȩpnie w każdej iteracji zewnȩtrznej pȩtli bierzemy , który leży najbliżej od . Jak siȩ za chwile okaże ten wierzchołek ma wierzchołek już prawidłowa̧ wartość i dlatego jest on usuwany z . Teraz korygujemy wartości dla pozostałych wierzchołków z uwzglȩdniaja̧c drogi, w których wierzchołek jest przedostatni. Przykład 1.6 Rysunek 1.3 przedstawia graf z dodatnimi długościami krawȩdzi. Poniższa tabela ilustruje działanie algorytmu Dijkstry. Pokazuje jak w kolejnych iteracjach zewnȩtrznej pȩtli wybrano wierzchołek oraz jak przedstawiaja̧ siȩ zbiór i macierz . iteracja 0 1 2 3 4 5 0 1 5 0 1 2 4 0 1 2 3 6 0 1 2 3 4 6 0 0 ) 1 1 ) 2 2 3 3 4 4 5 5 Rysunek 1.3: Graf z dodatnimi długościami krawȩdzi ) ) ) ) Aby udowodnić poprawność tego algorytmu, pokażemy przez indukcjȩ, że po każdej iteracji pȩtli mamy (a) dla każdego wierzchołka drogi z do . 4 zawiera ostateczna̧ długość minimalnej , 4 4 , a dla każdego innego wierzchołka 4 , Przed pierwsza̧ pȩtla̧ tylko . Warunki (a) i (b) sa̧ wiȩc spełnione, Ponieważ w najkrótszej drodze do , (b) dla każdego wierzchołka zawiera długość minimalnej spośród wszyst kich dróg z do , w których przedostatni wierzchołek należy do nie ma pȩtli, wiȩc drogi, w których jest przedostatni składaja̧ siȩ tylko z jednej krawȩdzi. 1.5. Najkrótsza droga w grafach acyklicznych 4 9 , dla którego W kolejnej iteracji wybieramy wierzchołek jest najmniejsza. Pokażemy, że wartość jest już ostateczna, czyli jest równa długości najkrótszej spośród wszystkich dróg z do . Przypuśćmy, że istnieje krótsza droga i niech bȩdzie takim wierzchołkiem, że droga z do zawiera tylko wierzchołki z i wierzchołek przed nie należy do . Mamy , bo inaczej mielibyśmy sprzeczność z założeniem indukzawiera długość najkrótszej spośród dróg, z których przedostatni wierzcyjnym, że chołek nie jest z . Zauważmy, że droga z do ma długość równa̧ aktualnej wartości . Z drugiej strony ponieważ długości sa̧ nieujemne mamy + 4 sprzeczność z zasada̧ wyboru . , Dlatego może być usuniȩty z . Nastȩpnie algorytm sprawdza dla każdego czy istnieje jakaś droga z do , w której wierzchołek jest przedostani i która jest krótsza od aktualnej wartości . Zauważmy, że dotychczasowa wartość zawierała długość najkrótszej drogi do , w których przedostatnim wierzchołkiem był jakiś wierz chołek z różny od . Dlatego po tym sprawdzeniu bȩdzie spełniony warunek (b). Czas działania algorytmu Dijkstry jest , ponieważ mamy tylko podwójne zagnieżdżenie pȩtli i liczba iteracji obu jest ograniczona przez . 1.5 Najkrótsza droga w grafach acyklicznych Inny przypadek, kiedy można szybciej niż w czasie policzyć długości najkrótszych dróg do wszystkich wierzchołków w grafie, zachodzi wtedy, gdy w grafie nie ma cykli. Najpierw pokażemy, że w grafie acyklicznym można tak ponumerować wierzchołki tak, każda krawȩdź prowadziła od wierzchołka z niższym numerem do wierzchołka z wyższym numerem. Lemat 1.7 W każdym skierowanym grafie którego nie wchodza̧ żadne krawȩdzie. ! bez cykli istnieje wierzchołek, do Dowód: Weźmy dowolny wierzchołek . Jeżeli nie wchodzi do niego, żadna krawȩdź, to koniec, znaleźliśmy. Jeżeli wchodzi, to niech bȩdzie wierzchołkiem, z którego prowadzi krawȩdź do . Albo jest dobry, albo prowadzi do niego krawȩdź od jakiegoś wierzchołka itd. Ponieważ zbiór wierzchołków jest skończony i nie ma w nim cyklu, wiȩc ten cia̧g musi siȩ kiedyś skończyć i dojdziemy do wierzchołka, do którego nie prowadza̧ żadne krawȩdzie. 8! Lemat 1.8 W skierowanym grafie acyklicznym można tak ponumerować wierzchołki, aby każda krawȩdź prowadziła od wierzchołka z niższym numerem do wierzchołka z wyższym numerem, czyli istnieje wzajemnie jednoznaczna funkcja taka, że jeżeli , to . )$#%#$#& Dowód: 2< 4 21 2 10 Rozdział 1. Grafy skierowane Jako dowód przedstawimy algorytm, który odpowiednio numeruje wierzchołki grafu kolejnymi liczbami naturalnymi. Najpierw sa̧ numerowane i usuwane z grafu wierzchołki, do których nie wchodza̧ żadne krawȩdzie. Po usuniȩciu tych wierzchołków i wychodza̧cych z nich krawȩdzi znowu otrzymamy graf bez cykli, który zawiera wierzchołki bez wchodza̧cych krawȩdzi. Teraz te z koleji wierzchołki sa̧ numerowane kolejnymi numerami i usuwane z grafu, i tak dalej aż do ponumerowania wszystkich wierzchołków. ) Rysunek 1.4: Graf acykliczny ) ) ) ) Przykład 1.9 Zastosujmy powyższy algorytm do grafu z rysunku 1.4. Wierzchołkami bez wchodza̧cych krawȩdzi sa̧ i . Przypisujemy wiȩc i oraz usuwamy i z grafu wraz z wychodza̧cymi z nich krawȩdziami. Teraz wierzchołek nie ma wchodza̧cych krawȩdzi, przypisujemy mu i usuwamy z grafu. W dalszych krokach algorytm przypisze wartości , oraz . Ostatecznie hunkcja ma postać: v s 1 a 4 b 2 c 3 d 5 t 6 Przedstawimy teraz algorytm wyliczaja̧cy odległości z do wszystkich wierzchołków w grafie acyklicznym. Zakładamy przy tym, że w grafie wierzchołki sa̧ ponumerowane tak, jak opisano to w lemacie 1.8. Bez straty ogólności można założyć, że jest pierwszy, ponieważ nie ma ścieżek z do wierzchołków o niższych numerach. ; , długości krawȩdzi Algorytm wyliczaja̧cy odległości wszystkich wierzchołków w grafie acyklicznym Dane wejściowe: acykliczny graf skierowany . Dane wyjściowe: Macierz dla każdego 4 odległości z do wszystkich wierzchołków. podstaw ; dla każdego 4 po kolei według numerów zrób: dla każdego , < 2< 1.6. Zadania 11 ( ( Udowodnimy przez indukcjȩ, że po -tej iteracji zewnȩtrznej pȩtli wierzchołki o numerch od 1 do maja̧ już prawidłowe wartości w macierzy . Po pierwszej iteracji ma prawidłowa̧ wartość . W tej iteracji pȩtli (zakładamy, że wierzchołki o numerach od 1 do maja̧ już prawidłowe wartości w macierzy ) obliczamy . Zauważmy, że najkrótsza droga z do przebiega przez wierzchołki o mniejszych od numerach. Niech bȩdzie przedostatnim wierzchołkiem na tej drodze. Długość tej drogi wynosi i zostanie odnaleziona w pȩtli. Ponieważ mamy podwójne zagnieżdżenie pȩtli i w obu liczba iteracji jest ograniczona przez , czas działania algorytmu jest . ( ) ( / 1 "/3 2< "/3 ( ( Przykład 1.10 (kontynuacja przykładu 1.9) Jeżeli zastosujemy ten algorytm do grafu z rysunku 1.4, to w kolejnych iteracjach zewnȩtrznej pȩtli obliczy on , , , , oraz . ) 1.6 Zadania 1. Narysuj wszystkie grafy skierowane ze zbiorem wierzchołków z nich sa̧ spójne? Które z nich sa̧ izomorficzne? . Które Wskazówka: Definicja izomorfizmu grafów skierowanych jest taka sama jak dla grafów nieskierowanych. 2. Które z grafów przedstawionych na rysunkach w tym rozdziale sa̧ spójne? 3. Narysuj możliwie jak najwiȩcej nieizomorficznych grafów skierowanych z trzema wierzchołkami . 4. Narysuj parȩ różnych i izomorficznych grafów skierowanych z możliwie najmniejsza̧ liczba̧ wierzchołków. ) ) Rysunek 1.5: Graf skierowany ) ) ) 5. Zastosuj algorytm Dijkstry i znajdź najkrótsza̧ drogȩ z do w grafie z rysunku 1.5. 6. Zastosuj algorytm Forda-Bellmana do grafu z rysunku 1.5. 7. Znajdź najkrótsza̧ drogȩ z do w grafach z rysunków 1.3 i 1.4. 8. Zastosuj algorytm Forda-Bellmana do grafów z rysunków 1.3 i 1.4. 12 Rozdział 1. Grafy skierowane 1.7 Problemy 1.7.1 Cykl Eulera w grafie skierowanym Cykl Eulera w grafie skierowanym jest to droga zamkni˛eta przechodzaca ˛ przez każda˛ kraw˛edź grafu dokładnie jeden raz. Udowodnij, że jeżeli graf skierowany jest spójny jako graf nieskierowany, to ma cykl Eulera wtedy i tylko wtedy, gdy w każdym jego wierzchołku liczba kraw˛edzi wchodzacych ˛ jest równa liczbie kraw˛edzi wychodzacych. ˛ Jeżeli w grafie jest p˛etla , to liczymy ja˛ jako kraw˛edź wchodzac ˛ a˛ do i jako wychodzac ˛ a˛ z . Zaproponuj algorytm wynajdywania cyklu Eulera w grafie skierowanym. Które z grafów przedstawionych na rysunkach w tym rozdziale maja̧ cykle Eulera? 1.7.2 Ciag ˛ de Bruijna bitów takie, że każdy ciag ˛ bitów Ciag ˛ de Bruijna rz˛edu to cykliczne ustawienie wyst˛epuje w tym cyklu dokładnie jeden raz jako kolejnych bitów. Na przykład ciag ˛ jest ciagiem ˛ de Bruijna rz˛edu 2 ( wyst˛epuje na pozycjach 4 i 1), aci ag ˛ jest ciagiem ˛ de Bruijna rz˛edu 3 ( wyst˛epuje na pozycjach 7, 8 i 1, a na pozycjach 8, 1 i 2). Aby otrzymaż ciag ˛ de Bruijna rz˛edu rozważmy nast˛epujacy ˛ graf skierowany G=(V,E). Wierzchołki grafu to zbiór wszystkich ciagów ˛ bitów długosci . Dwa wierzchołki , tworz a ˛ kraw˛ e dź, wtedy i tylko wtedy, gdy ostatnich bitów jest takie samo jak pierwsze bitów . Kraw˛edź ta jest etykietowana ostatnim bitem . Narysuj graf dla , i . Udowodnij, że: ) ) ))) )) % ) 0 ! 4 4 ) )) :) Graf jest spójny (jako graf nieskierowany) i posiada cykl Eulera. Etykiety każdej drogi długości tworza˛ nazw˛e ostatniego wierzchołka tej drogi. Cykl Eulera ma kraw˛edzi i przechodzi przez każdy wierzchołek dwa razy. ) Etykiety cyklu Eulera tworza˛ ciag ˛ de Bruijna rz˛edu . Wyznacz ciag ˛ de Bruijna rz˛edu .