Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
1
ALGORYTMY I STRUKTURY DANYCH
WYKŁAD 12 Algorytmy na grafach - drzewo rozpinające Grażyna Mirkowska PJWSTK, 2004
2
G. Mirkowska, ASD_12 Progamowanie dynamiczne
Plan wykładu Drzewo rozpinające grafu Algorytmy BFS i DFS Algorytm Kruskala Struktura Find-Union G. Mirkowska, ASD_12 Progamowanie dynamiczne
3
G. Mirkowska, ASD_12 Progamowanie dynamiczne
Drzewa rozpinające Niech G będzie dowolnym grafem niezorientowanym <V, E>. Drzewem rozpinającym grafu G = <V, E> nazywamy graf G* =<V*, E*> taki, że (1) V* = V, E* E (2) G* jest drzewem (tzn. grafem spójnym i acyklicznym). Definicja Graf i jego drzewa rozpinające G. Mirkowska, ASD_12 Progamowanie dynamiczne
4
Jak znaleźć drzewo rozpinające grafu (1)?
BFS Włóż do kolejki wybrany wierzchołek grafu i zamarkuj go. Dopóki kolejka nie jest pusta 1. Weź pierwszy element z kolejki i dopisz do kolejki wszystkie wierzchołki z nim sąsiednie, o ile nie były zamarkowane i zamarkuj je. 2. Wypisz krawędzie, po których przeszedłeś do nowych wierzchołków. 3. Usuń pierwszy element z kolejki. a b c d e f a a b f f b c e c e f c e d ab af bc be c d e d Wynik: d G. Mirkowska, ASD_12 Progamowanie dynamiczne
5
Jak znaleźć drzewo rozpinające grafu(2)?
DFS Włóż na stos wybrany wierzchołek grafu i zamarkuj go. Dopóki stos nie jest pusty : 1. Weź element ze szczytu stosu. 2 . Usuń ze stosu ten element. 3. Dopisz do stosu wszystkie wierzchołki z nim sąsiadujące, których jeszcze nie zamarkowano, a dopisane wierzchołki zamarkuj. 4. Wypisz krawędzie, po których przeszedłeś do wierzchołków zamarkowanych w p.3. a b c d e f e d f c b c b c a b b b ab a f e d f c fe Wynik: G. Mirkowska, ASD_12 Progamowanie dynamiczne
6
Minimalne drzewo rozpinające
Niech będzie dany graf G = <V, E> spójny niezorientowany, skończony i niech c : E R+ będzie funkcją kosztu określoną na krawędziach tego grafu. Problem Dla danego skończonego grafu G oraz danej funkcji kosztu c, znaleźć minimalne drzewo rozpinające, tzn. takie drzewo <V, T> rozpinające grafu G, że suma kosztów jego krawędzi S eT c (e) jest najmniejsza. G. Mirkowska, ASD_12 Progamowanie dynamiczne
7
Przykład: sieć wodociągowa
1 4 6 7 5 3 2 10 8 15 9 1 4 6 7 5 3 2 10 8 15 9 Jakieś drzewo rozpinające Minimalne drzewo rozpinające G. Mirkowska, ASD_12 Progamowanie dynamiczne
8
G. Mirkowska, ASD_12 Progamowanie dynamiczne
Lemat {Vi: 1 i k}= V Ti E dla 1 i k Vi Vj = dla i j di - drzewo Niech G = <V, E> będzie grafem spójnym, skończonym i niech c będzie jego funkcją kosztu. Niech d1= <V1, T1>, d2= <V2, T2>,......, dk = <Vk, Tk> będzie danym lasem rozpinającym G Vi Niech e = (v,w) będzie krawędzią o minimalnym koszcie, oraz niech v i w należą do różnych drzew tego podziału. v Dowód przez sprowadzenie do sprzeczności: Przypuśćmy, że istnieje takie drzewo do ktorego krawędz e nie nalezy i którego koszt jest minimalny. Ponieważ w tym drzewie musi istniec droga od v do w to nie przechodzi ona przez krawędz e. Zatem weżmy na tej drodze dwa wierzchołki sąsiednie jeden ze zbioru Vi a drugi nie należący do Vi. Wtedy krawędź (v', w') ,która nie należała do żadnego z drzew danych musi mieć koszt większy niz e. Zastępując krawędź (v',w') krawędzią e otrzymamy drzewo rozpinające o koszcie mniejszym niż wybrane. Sprzeczność. v’ w Jeżeli drzewo rozpinające <V,T*> grafu G ma najmniejszy koszt wśród drzew rozpinających zawierających wszystkie Ti., to e T*. w’ Ale c(v’,w’) > c(v,w) G. Mirkowska, ASD_12 Progamowanie dynamiczne
9
G. Mirkowska, ASD_12 Progamowanie dynamiczne
Algorytm Kruskala Jeśli drzewo rozpinające ma mieć koszt minimalny i ma zawierać dany las drzew, to musi też zawierać krawędź e, której koszt jest najmniejszy wśród wszystkich krawędzi nie należących do żadnego z drzew i która łączy wierzchołki z różnych drzew. Utworzyć kolejkę priorytetową PQ z wszystkimi krawędziami grafu, uporządkowanymi ze względu na koszt. Utworzyć początkowy podział Po zbioru V jako rodzinę jednoelementowych zbiorów {x}, gdzie x V (stanowiący las początkowy). Przeglądać kolejno elementy kolejki i jeżeli końce rozważanej krawędzi należą do różnych zbiorów podziału, to krawędź dołączyć do tworzonego drzewa, a zbiory podziału połączyć. Algorytm G. Mirkowska, ASD_12 Progamowanie dynamiczne
10
G. Mirkowska, ASD_12 Progamowanie dynamiczne
Przykład 1. (1,2) 2. (1,4) 3.(2,3) 4. (1,3) 5.(4,5) 6. (3,5) 7. (1,5) 7. (6,7) 8. (1,6) 10. (7,4) 15. (4,3) + 5 2 3 4 7 1 6 15 8 10 1| 2| 3| 4| 5| 6| 7 + 1, 2| 3| 4| 5| 6| 7 + 1, 2, 4| 3| 5| 6| 7 1, 2, 3, 4| 5| 6| 7 + 1, 2, 3, 4, 5| 6| 7 + 1, 2, 3, 4, 5| 6, 7 + 1, 2, 3, 4, 5, 6, 7 + Kolejka Priorytetowa Podział G. Mirkowska, ASD_12 Progamowanie dynamiczne
11
Algorytm Zakładam, że 1. pq jest kolejką priorytetową wszystkich krawędzi danego grafu G = <V, E>, P jest początkowym podziałem zbioru V, T pustym stosem (będą tam krawędzie drzewa). { while (not empty (pq) and card(P)>1) do kr := min(pq); pq := delmin(pq); A := Find(P,kr.początek); B := Find(P,kr.koniec); if A B then P := Union(P,B,A); T := push(T,kr) fi od } Find (P,x) = ten zbiór podziału P, do którego należy x Union(P,B,A) = podział powstający z P przez usunięcie zbiorów A, B i dołączenie zbioru A B. G. Mirkowska, ASD_12 Progamowanie dynamiczne
12
Jak zapamiętać podział? Przykład
Struktura Find-Union Niech U będzie skończonym zbiorem, a P podziałem zbioru U. Rozważamy strukturę, w której określone są dwie operacje Find(P,x), Union(P,A,B): Find(P,x) zwraca ten zbiór podziału P, do którego należy x, Union(P,A,B) zwraca nowy podział zbioru U, który powstaje z P przez zastąpienie zbiorów A, B ich suma teoriomnogościową . Zmień nazwę zbioru na np B, dla wszystkich elementów, które należały do zbioru o nazwie A . Koszt Find jest stały Jak zapamiętać podział? Przykład Niech U={1,2,3,4,5,6} i P ={{1,2},{3},{4,5,6}}. Do zapamiętania podziału wystarczy tablica np. R = [1,1,2,3,3,3]. Koszt Union -liniowy Wtedy Find(P,i)= R(i) Union(P,A,B) G. Mirkowska, ASD_12 Progamowanie dynamiczne
13
Implementacja na drzewach
c.d. Struktura Find-Union Drzewa z balansowaniem i kompresją ścieżek A A A B Koszt Algorytmu Kruskala w tej implementacji: Koszt utworzenia kolejki priorytetowej = O(m lg m). Koszt 2m operacji Find = O(mlgn), każda operacja Find O(lg(n)) Koszt m operacji Union = O(m) , każda operacja Union O(1) Koszt Razem O(m lg n) G. Mirkowska, ASD_12 Progamowanie dynamiczne
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.