ASD 11 - Strona główna AGH
Transkrypt
ASD 11 - Strona główna AGH
Algorytmy i Struktury Danych Wykład XI Grafy – cd. 1 Co dziś? Algorytmy grafowe # silne składowe spójne # sortowanie topologiczne # graf eulerowski Minimalne drzewa rozpinające # algorytm Kruskala # algorytm Prima Najkrótsze ścieżki z jednym źródłem # relaksacja # algorytm Dijkstry # algorytm Bellmana-Forda ASD 11 2 Silnie spójne składowe Taki zbiór U ⊆ V wierzchołków, że dla każdej pary (u,v) z U istnieją ścieżki u v oraz v u Algorytm 1. przeszukiwanie w głąb grafu G 2. utworzenie GT 3. przeszukiwanie w głąb grafu GT w kolejności malejących wartości „znacznika końca” grafu G 4. oznaczenie (wypisanie) wierzchołków każdego drzewa z lasu przeszukiwania ASD 11 3 1 Transpozycja grafu - GT ASD 10 4 Transpozycja grafu - GT ASD 11 5 Silnie spójne składowe ASD 11 6 2 Silnie spójne składowe ASD 11 7 Silnie spójne składowe ASD 11 8 Silnie spójne składowe ASD 11 9 3 Sortowanie topologiczne Dotyczy dagów (dag – directed acyclic graph) Uporządkowanie wierzchołków grafu G w taki sposób, że jeśli istnieje krawędź (u,v) to wierzchołek u występuje przed v Algorytm 1. przeszukiwanie w głąb grafu G 2. kiedy zakończymy „przetwarzanie” v wstawiamy go do listy (stos) 3. wypisanie wierzchołków z listy ASD 11 10 Sortowanie topoplogiczne ASD 11 11 Cykl Eulera Cykl Eulera – cykl który zawiera wszystkie krawędzie grafu i każdą tylko raz Graf nazywamy eulerowskim jeśli posiada cykl eulera Graf nieskierowany – wszystkie wierzchołki maja parzysty stopień Graf skierowany – wszystkie wierzchołki mają równą ilość krawędzi wchodzących i wychodzących Ścieżka eulera ASD 11 12 4 ASD 11 13 Cykl Eulera Mamy graf eulerowski 1. Wyznaczamy cykl z dowolnego wierzchołka 2. Przechodzimy wyznaczony cykl aż do wierzchołka który ma jeszcze nieodwiedzone krawędzie i wypisujemy odwiedzone krawędzie (odkładamy do kolejki) 3. Od tego wierzchołka rekurencyjnie wywołujemy algorytm 4. Kończymy przeglądanie cyklu czyli wracamy do 2 ASD 11 14 Drzewa rozpinające Pojęcie drzewa rozpinającego Drzewo rozpinające ma V-1 krawędzi Problem minimalnego drzewa rozpinającego ASD 11 15 5 Drzewa rozpinające Graf spójny, bez wag: # przeszukiwanie w głąb # przeszukiwanie w szerz ASD 11 16 Schemat algorytmu – graf ważony 1. Dopóki zbiór krawędzi nie tworzy drzewa rozpinającego: znajdź krawędź bezpieczną i dołącz ją do zbioru tworzącego drzewo ASD 11 17 Algorytm Kruskala 1. Tworzymy zbiór dla każdego wierzchołka 2. Sortujemy krawędzie niemalejąco 3. Dla każdej krawędzi (u,v) : jeśli u należy do innego zbioru niż v to łączymy zbiory i (u,v) dokładamy do drzewa ASD 11 18 6 Algorytm Kruskala Złożoność # tworzenie zbiorów # sortowanie # dla każdej krawędzi O( V ) O( E lg(E) ) O( E ) # O( E lg(E) ) ASD 11 19 Algorytm Prima 1. Ustalamy korzeń minimalnego drzewa 2. Do drzewa minimalnego dokładamy krawędź lekką 3. Krok drugi wykonujemy dla wszystkich wierzchołków ASD 11 20 Algorytm Prima Implementacja # kolejka priorytetowa dla wierzchołków # klucze dla wierzchołków na początek ∞ potem równe wadze krawędzi # wskazanie na ojca Struktura dla grafu ASD 11 21 7 Algorytm Prima Złożoność # budowanie kopca O(V) # pętla główna dokładanie wierzchołka z kolejki O(V lg(V) ) modyfikacja kluczy wierzchołków O(E lg(V) ) # O( E lg(V) ) # Kopiec Fibonacciego ASD 11 22 Najkrótsze ścieżki z jednym źródłem Mamy dany ważony graf skierowany oraz wyróżniony wierzchołek s, poszukujemy najkrótszych ścieżek z wierzchołka s do wszystkich wierzchołków # najkrótsze ścieżki z jednym wierzchołkiem docelowym # najkrótsza ścieżka między parą wierzchołków # najkrótsze ścieżki między wszystkimi parami wierzchołków ASD 11 23 Relaksacja Inaczej – osłabianie ograniczeń Górne oszacowanie na długość ścieżki Implementacja # wartość długości pamiętamy w wierzchołku # na początku ∞ # pamiętamy wskazanie na ojca ASD 11 24 8 Algorytm Dijkstry 1. Mamy zbiór S w którym są wierzchołki dla których najkrótsze ścieżki są już znalezione 2. Dokładamy do S wierzchołek o najmniejszej odległości od s 3. Wykonujemy relaksację krawędzi wychodzących z dokładanego wierzchołka 4. Jeśli są jeszcze wierzchołki to idź do 2 ASD 11 25 Algorytm Dijkstry Wierzchołki pamiętamy w kolejce priorytetowej (kopce) Tylko grafy o dodatnich wagach (ujemne cykle) ASD 11 26 Algorytm Dijkstry Złożoność # budowa kopca O(V) # pobieranie wierzchołków O(V lg(V)) # relaksacja O(E lg(V)) # O((V+E)lg(V)) = O(E lg(V)) ASD 11 27 9 Algorytm Bellmana-Forda 1. Ustawiamy dla wierzchołków ∞ 2. Pętla o |V| - 1 przebiegach: dla każdej krawędzi zrób relaksację 3. Dla każdej krawędzi sprawdź czy nie ma ujemnego cyklu ASD 11 28 Algorytm Bellmana-Forda Grafy o ujemnych wagach Sprawdza czy nie ma ujemnych pętli Złożoność # O(V*E) ASD 11 29 DAG – najkrótsze ścieżki 1. Posortuj graf topologicznie 2. Dla każdego wierzchołka w porządku topologicznym: dla każdego wierzchołka sąsiedniego: zrób relaksacje ASD 11 30 10 DAG – najkrótsze ścieżki Złożoność # O( V+E ) Ścieżka krytyczna (PERT) ASD 11 31 ASD 11 32 Pytania? KONIEC! 11