Matematyczne Podstawy Informatyki dr inż. Andrzej Grosser Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska Rok akademicki 03/0
Przeszukiwanie w głąb i wszerz I Przeszukiwanie metodą wszerz:. Wybrany wierzchołek grafu włożyć do kolejki Q (FIFO) i zaznaczenie go.. Dopóki kolejka q nie jest pusta:. Wybór pierwszego elementu kolejki Q.. Dopisanie do kolejki wszystkich wierzchołków z nim sąsiadujących (o ile nie były jeszcze zaznaczone) i zaznaczenie każdego z nich..3 Usunięcie pierwszego elementu kolejki Q.
Przeszukiwanie w głąb i wszerz II Przeszukiwanie metodą w głąb:. Zaznaczenie wybranego wierzchołka v.. Dla każdego wierzchołka sąsiadującego z v:. Jeśli wierzchołek nie został zaznaczony jako odwiedzony to rekurencyjnie odwiedź dany wierzchołek.
Przeszukiwanie w głąb i wszerz III Przeszukiwanie wszerz: 6 9 0
Przeszukiwanie w głąb i wszerz IV Przeszukiwanie w głąb: 6 3 9 0
Poszukiwanie ścieżki prostej Rozwiązanie bazuje na przeszukiwaniu w głąb. Algorytm wykorzystuje rekurencyjną funkcję searchs(int v, int w). Funkcja sprawdza dla każdej krawędzi incydentnej z wierzchołkiem v, czy istnieje ścieżka prosta od t do v, która nie przechodzi przez ten wierzchołek. Do oznaczenia wierzchołków, które już zostały odwiedzone służy wektor. Algorytm działa w czasie liniowym.
Ścieżka Hamiltona Algorytm wykorzystuje rekurencyjną funkcję searchh(int v, int w, int d). Funkcja zwraca prawdę jedynie w sytuacji, gdy algorytm znajdzie ścieżkę o długości d. Poszukiwanie ścieżki Hamiltona wymaga czasu wykładniczego (przeszukiwanie nawet niewielkich grafów (np. około 3 wierzchołkach) mogłoby zająć stulecia).
Znajdowanie ścieżki Eulera w czasie liniowym Algorytm startuje od wstępnego przetworzenia grafu i sprawdzenia jego spójności. W kolejnym kroku budowana jest tablica stopni wierzchołków. Funkcja pomocnicza jest odpowiedzialna za analizę i usuwanie krawędzi na ścieżce cyklicznej.
Minimalne drzewo rozpinające. Minimalne drzewo rozpinające - drzewo rozpinające grafu o najmniejszej możliwej sumie wag.. Algorytmy:. Kruskala (O( E log( V )),. Prima (O( E log( V )),.3 Boruvki (O( E log( V )).
Algorytm Kruskala I. Dane: Skończony graf spójny z wagami, którego krawędzie zostały uporządkowane według wzrastających wag.. E := 3. Dla j = do E(G) jeśli graf E e j jest acykliczny, to dołącz e j do E.
Algorytm Kruskala II 6 6 3 0
Algorytm Kruskala III 6 6 3 0
Algorytm Kruskala IV 6 6 3 0
Algorytm Kruskala V 6 6 3 0
Algorytm Kruskala VI 6 6 3 0
Algorytm Kruskala VII 6 6 3 0
Algorytm Kruskala VIII 6 6 3 0
Algorytm Kruskala IX 6 6 3 0
Algorytm Prima I. E :=. Wybór w ze zbioru V(G) i W := {w}. 3. Dopóki W V (G): 3. Wybór w zbiorze E(G) krawędzi {u, v} o najmniejszej możliwej wadze, takiej że u W i v V (G)\W 3. Dołączenie krawędzi {u, v} do zbioru E i wierzchołka v do zbioru V.
Algorytm Prima II 6 6 3 0
Algorytm Prima III 6 6 3 0
Algorytm Prima IV 6 6 3 0
Algorytm Prima V 6 6 3 0
Algorytm Prima VI 6 6 3 0
Algorytm Prima VII 6 6 3 0
Algorytm Prima VIII 6 6 3 0
Algorytm Prima IX 6 6 3 0
Algorytm Boruwki I. Dla każdego wierzchołka v w grafie G:. przeglądanie zbioru incydentnych krawędzi z v,. wybór krawędzi o najmniejszej wadze i dołączenie jej do rozwiązania (zbioru E ).. Tworzenie grafu G w którym wierzchołki stanowiące spójne składowe zostaną ze sobą połączone. 3. Dopóki nie ma jednej spójnej składowej, powtarza się kroki - za graf G podstawiając graf G
Algorytm Boruwki II 6 6 3 0
Algorytm Boruwki III 6 6 3 0
Algorytm Boruwki IV 6 6 3 0
Zagadnienie najkrótszej drogi I 6 6 3 0 Mapa stanowi graf spójny, w którym każdej krawędzi przypisano nieujemną wagę. Ten rodzaj grafu jest nazywany grafem z wagami. Zagadnienie polega na znalezieniu drogi z jednego miejsca do drugiego (np. z A do K), tak aby suma wag na tej drodze była najmniejsza. Algorytymy szukające najkrótszej drogi
Zagadnienie najkrótszej drogi II. algorytm Dijkstry,. algorytm Forda-Bellmana, 3. algorytm Floyda-Warshalla.
Algorytm Dijkstry I for v V (G) do d[v] := poprzednik[v] := niezdefiniowane end d[s] := 0 Q := V while Q niepuste do u := Zdejmij Min(Q) for v sasiad(u) do if d[v] > d[u] + w(u, v) then d[v] := d[u] + w(u, v) poprzednik[v] := u Dodaj(Q, v) end end end
Algorytm Dijkstry II 6 6 3 0 i 6 d(i) 0 p(i) 0 - - - - - - -
Algorytm Dijkstry III 6 6 3 0 i 6 d(i) 0 p(i) 0 - - - - -
Algorytm Dijkstry IV 6 6 3 0 i 6 d(i) 0 p(i) 0 - - -
Algorytm Dijkstry V 6 6 3 0 i 6 d(i) 0 3 p(i) 0-6 6
Algorytm Dijkstry VI 6 9 3 6 3 0 i 6 d(i) 0 3 p(i) 0-6 6
Algorytm Dijkstry VII 6 9 3 6 3 0 i 6 d(i) 0 0 3 p(i) 0 6 6
Algorytm Dijkstry VIII 6 9 3 6 3 0 i 6 d(i) 0 0 3 p(i) 0 6 6
Algorytm Dijkstry IX 6 9 3 6 3 0 i 6 d(i) 0 0 3 p(i) 0 6 6
Algorytm Forda-Bellmana I for v V (G) do d[v] := poprzednik[v] := niezdefiniowane end d[s] := 0 for i = to V (G) do for (u, v) E(G) do if d[v] > d[u] + w(u, v) then d[v] = d[u] + w(u, v) poprzednik[v] = u end end end
Algorytm Forda-Bellmana II 6 6 3 0 i 6 d(i) 0 p(i) 0 - - - - - - -
Algorytm Forda-Bellmana III 6 6 3 0 i 6 d(i) 0 p(i) 0 - - - - -
Algorytm Forda-Bellmana IV 6 6 3 0 i 6 d(i) 0 p(i) 0 - - - - -
Algorytm Forda-Bellmana V 6 6 3 0 i 6 d(i) 0 p(i) 0 - - -
Algorytm Forda-Bellmana VI 6 6 3 0 i 6 d(i) 0 0 p(i) 0 3 -
Algorytm Forda-Bellmana VII 6 6 3 0 i 6 d(i) 0 0 3 p(i) 0 -
Algorytm Forda-Bellmana VIII 6 6 3 0 i 6 d(i) 0 0 3 p(i) 0
Zagadnienie chińskiego listonosza Oryginalne zagadnienie polegało na znalezieniu takiej drogi dla listonosza, żeby mógł przejść najkrótszą łączną drogę i wrócić do punktu wyjścia (musi przejść po każdej ulicy przynajmniej raz). Dla grafów Eulerowskich zagadnienie sprowadza się do szukania cyklu Eulera. Dla grafów półeulerowskich wyznacza się najpierw ścieżkę półeulerowską i wyszukuje najkrótszą ściężkę łączącą wierzchołki o nieparzystych stopniach.
Problem komiwojażera Problem polega na tym, aby komiwojażer, który ma za zadanie dojechać do kilku miejsc, znalazł drogę o najmniejszej łącznej długości. Problem daje się sprowadzić do grafów z wagami i polega na znalezieniu cyklu Hamiltona o najmniejszej sumie wag na danej drodze. Algorytmy ogólne są nieefektywne - zamiast nich stosowane są algorytmy heurystyczne, które wyszukują rozwiązania przybliżone.
Literatura Do napisania materiałów wykorzystano:. R.J. Wilson Wprowadzenie do teorii grafów, PWN 00. R. Sedgewick Algorytmy w C++ - grafy, Wydawnictwo RM 003 3. K.A. Ross Matematyka dyskretna, PWN 003. P. Rembelski Algorytmy i struktury danych