Algorytmy i Struktury Danych. Grafy. Drzewo rozpinajace. ˛ Minimalne drzewo rozpinajace. ˛ 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 / 42 Plan wykładu Drzewo rozpinajace ˛ Algorytm Kruskala Algorytm Prima Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 2 / 42 Drzewo rozpinajace ˛ grafu Definicja Drzewem rozpinajacym ˛ grafu G nazywamy spójny i acykliczny podgraf grafu G zawierajacy ˛ wszystkie jego wierzchołki. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 3 / 42 Drzewo rozpinajace ˛ grafu Definicja Drzewem rozpinajacym ˛ grafu G nazywamy spójny i acykliczny podgraf grafu G zawierajacy ˛ wszystkie jego wierzchołki. Twierdzenie Każdy graf spójny zawiera drzewo rozpinajace. ˛ Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 3 / 42 Drzewo rozpinajace ˛ grafu Definicja Drzewem rozpinajacym ˛ grafu G nazywamy spójny i acykliczny podgraf grafu G zawierajacy ˛ wszystkie jego wierzchołki. Twierdzenie Każdy graf spójny zawiera drzewo rozpinajace. ˛ Twierdzenie W grafie spójnym G = (V , E ) krawedź ˛ e ∈ E jest krawedzi ˛ a˛ ciecia ˛ wtedy i tylko wtedy, gdy e należy do każdego drzewa rozpinajacego ˛ grafu G. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 3 / 42 Drzewo rozpinajace ˛ grafu Generowanie drzewa rozpinajacego ˛ danego grafu spójnego G można realizować biorac ˛ kolejno krawedzie ˛ z pewnej listy i akceptujac ˛ je po sprawdzeniu, czy nie tworza˛ one cyklu z dotychczas zaakceptowanymi krawedziami. ˛ Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 4 / 42 Drzewo rozpinajace ˛ grafu Generowanie drzewa rozpinajacego ˛ danego grafu spójnego G można realizować biorac ˛ kolejno krawedzie ˛ z pewnej listy i akceptujac ˛ je po sprawdzeniu, czy nie tworza˛ one cyklu z dotychczas zaakceptowanymi krawedziami. ˛ Generowanie wszystkich drzew rozpinajacych ˛ danego grafu jest złożone obliczeniowo, ponieważ drzew rozpinajacych ˛ może być bardzo dużo. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 4 / 42 Drzewo rozpinajace ˛ grafu - przykład Pokażemy, że graf ten zawiera 8 różnych drzew rozpinajacych. ˛ e v3 v4 b d c a v1 v2 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 5 / 42 Drzewo rozpinajace ˛ grafu - przykład Pokażemy, że graf ten zawiera 8 różnych drzew rozpinajacych. ˛ Łatwo zauważyć, że każde drzewo rozpinajace ˛ tego grafu ma 3 krawedzie. ˛ e v3 v4 b d c a v1 v2 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 5 / 42 Drzewo rozpinajace ˛ grafu - przykład Pokażemy, że graf ten zawiera 8 różnych drzew rozpinajacych. ˛ Łatwo zauważyć, że każde drzewo rozpinajace ˛ tego grafu ma 3 krawedzie. ˛ e v3 v4 b d c a v1 v2 Bożena Woźna-Szcześniak (AJD) Uporzadkujmy ˛ wszystkie krawedzie ˛ grafu, tworzac ˛ liste˛ krawedzi. ˛ Rozważać bedziemy ˛ nastepuj ˛ ac ˛ a˛ (a, b, c, d, e). liste˛ krawedzi: ˛ Algorytmy i Struktury Danych. Wykład 9 5 / 42 Drzewo rozpinajace ˛ grafu - przykład Pokażemy, że graf ten zawiera 8 różnych drzew rozpinajacych. ˛ Łatwo zauważyć, że każde drzewo rozpinajace ˛ tego grafu ma 3 krawedzie. ˛ e v3 v4 b d c a v1 v2 Uporzadkujmy ˛ wszystkie krawedzie ˛ grafu, tworzac ˛ liste˛ krawedzi. ˛ Rozważać bedziemy ˛ nastepuj ˛ ac ˛ a˛ (a, b, c, d, e). liste˛ krawedzi: ˛ Każdy podzbiór krawedzi ˛ bedziemy ˛ przedstawiać w postaci listy uporzadkowanej, ˛ zgodnie z porzadkiem ˛ w liście krawedzi; ˛ Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 5 / 42 Drzewo rozpinajace ˛ grafu - przykład Do generowania wszystkich drzew rozpinajacych ˛ zastosujemy algorytm z nawrotami. (a, b, c, d, e) e v3 v4 b d c a v1 v2 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 6 / 42 Drzewo rozpinajace ˛ grafu - przykład Do generowania wszystkich drzew rozpinajacych ˛ zastosujemy algorytm z nawrotami. Zgodnie z algorytmem z nawrotami, bedziemy ˛ tworzyć kolejne listy. (a, b, c, d, e) e v3 v4 b d c a v1 v2 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 6 / 42 Drzewo rozpinajace ˛ grafu - przykład Do generowania wszystkich drzew rozpinajacych ˛ zastosujemy algorytm z nawrotami. Zgodnie z algorytmem z nawrotami, bedziemy ˛ tworzyć kolejne listy. (a, b, c, d, e) e v3 v4 b d c lista czerwona oznacza, że kraw˛edzie te zawieraja˛ cykl i trzeba sie˛ wycofać. a v1 v2 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 6 / 42 Drzewo rozpinajace ˛ grafu - przykład Do generowania wszystkich drzew rozpinajacych ˛ zastosujemy algorytm z nawrotami. Zgodnie z algorytmem z nawrotami, bedziemy ˛ tworzyć kolejne listy. (a, b, c, d, e) e v3 v4 b d c a v1 v2 Bożena Woźna-Szcześniak (AJD) lista czerwona oznacza, że kraw˛edzie te zawieraja˛ cykl i trzeba sie˛ wycofać. lista podkreślona oznaczaja drzewo rozpinajace. ˛ Algorytmy i Struktury Danych. Wykład 9 6 / 42 Drzewo rozpinajace ˛ grafu - przykład Do generowania wszystkich drzew rozpinajacych ˛ zastosujemy algorytm z nawrotami. Zgodnie z algorytmem z nawrotami, bedziemy ˛ tworzyć kolejne listy. (a, b, c, d, e) e v3 v4 b d c a v1 v2 lista czerwona oznacza, że kraw˛edzie te zawieraja˛ cykl i trzeba sie˛ wycofać. lista podkreślona oznaczaja drzewo rozpinajace. ˛ Listy (drzewa) generowane sa˛ w porzadku ˛ leksykograficznym (alfabetycznym). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 6 / 42 Drzewo rozpinajace ˛ grafu - przykład (), (a), (a, b), (a, b, c) – Mamy pierwsze drzewo rozpinajace. ˛ (a, b, c, d, e) e v3 v4 b d c a v1 v2 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 7 / 42 Drzewo rozpinajace ˛ grafu - przykład (), (a), (a, b), (a, b, c) – Mamy pierwsze drzewo rozpinajace. ˛ (a, b, c, d, e) e v3 v4 b d c Usuwamy ostatnia˛ krawedź ˛ z (a, b, c), dodajemy kolejna˛ krawedź ˛ z listy i otrzymujemy: (a, b, d ) - zawiera cykl. a v1 v2 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 7 / 42 Drzewo rozpinajace ˛ grafu - przykład (), (a), (a, b), (a, b, c) – Mamy pierwsze drzewo rozpinajace. ˛ (a, b, c, d, e) e v3 v4 b d c a v1 v2 Bożena Woźna-Szcześniak (AJD) Usuwamy ostatnia˛ krawedź ˛ z (a, b, c), dodajemy kolejna˛ krawedź ˛ z listy i otrzymujemy: (a, b, d ) - zawiera cykl. Usuwamy zatem d i generujemy nastepn ˛ a˛ liste: ˛ (a, b, e) – Otrzymaliśmy drugie drzewo rozpinajace. ˛ Algorytmy i Struktury Danych. Wykład 9 7 / 42 Drzewo rozpinajace ˛ grafu - przykład Usuwamy krawedź ˛ e, nie możemy jednak kontynuować bo e jest ostatnia˛ krawedzi ˛ a˛ na liście. (a, b, c, d, e) e v3 v4 b d c a v1 v2 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 8 / 42 Drzewo rozpinajace ˛ grafu - przykład Usuwamy krawedź ˛ e, nie możemy jednak kontynuować bo e jest ostatnia˛ krawedzi ˛ a˛ na liście. (a, b, c, d, e) e v3 v4 b d c Usuwamy kolejna˛ krawedź ˛ -bi generujemy: (a, c), (a, c, d ). Mamy kolejne drzewo rozpinajace. ˛ a v1 v2 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 8 / 42 Drzewo rozpinajace ˛ grafu - przykład Usuwamy krawedź ˛ e, nie możemy jednak kontynuować bo e jest ostatnia˛ krawedzi ˛ a˛ na liście. (a, b, c, d, e) e v3 v4 b d c a v1 v2 Bożena Woźna-Szcześniak (AJD) Usuwamy kolejna˛ krawedź ˛ -bi generujemy: (a, c), (a, c, d ). Mamy kolejne drzewo rozpinajace. ˛ Usuwamy ostatnia˛ krawedź ˛ di kontynuujemy: (a, c, e). Znaleźliśmy kolejne drzewo rozpinajace. ˛ Algorytmy i Struktury Danych. Wykład 9 8 / 42 Drzewo rozpinajace ˛ grafu - przykład Usuwamy krawedź ˛ e, nastepnie ˛ krawedź ˛ c, po czym generujemy kolejno: (a, d ), (a, d , e). Mamy kolejne drzewo rozpinajace. ˛ (a, b, c, d, e) e v3 v4 b d c a v1 v2 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 9 / 42 Drzewo rozpinajace ˛ grafu - przykład Usuwamy krawedź ˛ e, nastepnie ˛ krawedź ˛ c, po czym generujemy kolejno: (a, d ), (a, d , e). Mamy kolejne drzewo rozpinajace. ˛ (a, b, c, d, e) e v3 v4 b d c Usuwamy krawedź ˛ e, potem d tworzymy nowa˛ liste: ˛ (a, e). Nie możemy jednak kontynuować wiec ˛ usuwamy krawedzie ˛ e oraz a. a v1 v2 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 9 / 42 Drzewo rozpinajace ˛ grafu - przykład Usuwamy krawedź ˛ e, nastepnie ˛ krawedź ˛ c, po czym generujemy kolejno: (a, d ), (a, d , e). Mamy kolejne drzewo rozpinajace. ˛ (a, b, c, d, e) e v3 v4 b d c a v1 v2 Bożena Woźna-Szcześniak (AJD) Usuwamy krawedź ˛ e, potem d tworzymy nowa˛ liste: ˛ (a, e). Nie możemy jednak kontynuować wiec ˛ usuwamy krawedzie ˛ e oraz a. Kolejnymi utworzonymi listami sa˛ wiec: ˛ (b), (b, c), (b, c, d ). Otrzymaliśmy kolejne drzewo rozpinajace. ˛ Algorytmy i Struktury Danych. Wykład 9 9 / 42 Drzewo rozpinajace ˛ grafu - przykład Usuwamy krawedź ˛ d , ale kolejna lista: (b, c, e) zawiera cykl. Usuwamy wiec ˛ kolejno krawedź ˛ e, potem c i generujemy listy (b, d ) i (b, d , e). Znaleźliśmy kolejne drzewo rozpinajace. ˛ (a, b, c, d, e) e v3 v4 b d c a v1 v2 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 10 / 42 Drzewo rozpinajace ˛ grafu - przykład Usuwamy krawedź ˛ d , ale kolejna lista: (b, c, e) zawiera cykl. Usuwamy wiec ˛ kolejno krawedź ˛ e, potem c i generujemy listy (b, d ) i (b, d , e). Znaleźliśmy kolejne drzewo rozpinajace. ˛ (a, b, c, d, e) e v3 v4 b d c a v1 v2 Bożena Woźna-Szcześniak (AJD) Usuwamy kolejno krawedzie ˛ eid a kolejna˛ lista˛ jest: (b, e). Usuwamy e, a nastepnie ˛ b i tworzymy listy: (c), (c, d ), (c, d , e). Mamy kolejne drzewo rozpinajace. ˛ Algorytmy i Struktury Danych. Wykład 9 10 / 42 Drzewo rozpinajace ˛ grafu - przykład Usuwamy krawedź ˛ d , ale kolejna lista: (b, c, e) zawiera cykl. Usuwamy wiec ˛ kolejno krawedź ˛ e, potem c i generujemy listy (b, d ) i (b, d , e). Znaleźliśmy kolejne drzewo rozpinajace. ˛ (a, b, c, d, e) e v3 v4 b d c a v1 v2 Bożena Woźna-Szcześniak (AJD) Usuwamy kolejno krawedzie ˛ eid a kolejna˛ lista˛ jest: (b, e). Usuwamy e, a nastepnie ˛ b i tworzymy listy: (c), (c, d ), (c, d , e). Mamy kolejne drzewo rozpinajace. ˛ Usuwamy kolejno e i d , a nastepnie ˛ generujemy las (c, e). Usuwamy e, nastepnie ˛ c i generujemy kolejne listy: (d ), (d , e), (e). Nie ma już jednak wiecej ˛ drzew rozpinajacych. ˛ Algorytmy i Struktury Danych. Wykład 9 10 / 42 Drzewo rozpinajace ˛ grafu - przykład Usuwamy kolejno krawedzie ˛ e i d, a kolejna˛ lista˛ jest: (b, e). Usuwamy e, a nastepnie ˛ b i tworzymy listy: (c), (c, d ), (c, d , e). Mamy kolejne drzewo rozpinajace. ˛ (a, b, c, d, e) e v3 v4 b d c a v1 v2 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 11 / 42 Drzewo rozpinajace ˛ grafu - przykład Usuwamy kolejno krawedzie ˛ e i d, a kolejna˛ lista˛ jest: (b, e). Usuwamy e, a nastepnie ˛ b i tworzymy listy: (c), (c, d ), (c, d , e). Mamy kolejne drzewo rozpinajace. ˛ (a, b, c, d, e) e v3 v4 b d c a v1 v2 Bożena Woźna-Szcześniak (AJD) Usuwamy kolejno e i d , a nastepnie ˛ generujemy las (c, e). Usuwamy e, nastepnie ˛ c i generujemy kolejne listy: (d ), (d , e), (e). Nie ma już jednak wiecej ˛ drzew rozpinajacych. ˛ Algorytmy i Struktury Danych. Wykład 9 11 / 42 Drzewo rozpinajace ˛ grafu - przykład e v3 v4 b d c a v1 v2 Drzewa rozpinajace ˛ v4 v3 v4 v3 v4 v3 v4 v3 v1 v2 v1 v2 v1 v2 v1 v2 (a,b,c) (a,b,e) (a,c,d) (a,c,e) v4 v3 v4 v3 v4 v3 v4 v3 v1 v2 v1 v2 v1 v2 v1 v2 (a,d,e) Bożena Woźna-Szcześniak (AJD) (b,c,d) (b,d,e) Algorytmy i Struktury Danych. (c,d,e) Wykład 9 12 / 42 Generowanie drzew rozpinajacych ˛ grafu - założenia Każdemu wierzchołkowi grafu przyporzadkujemy ˛ dwa atrybuty: Korzen[r ] - tzw. korzeń drzewa, w którym znajduje sie˛ wierzchołek r. Poprzednik [v ] - poprzednik wierzchołka v na jedynej ścieżce łacz ˛ acej ˛ v z korzeniem. Poprzednik korzenia jest nieokreślony; w algorytmach zakładamy, że jest równy 0 lub NIL. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 13 / 42 Założenia - przykład f d i a g b j e h c k Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 14 / 42 Założenia - przykład (g, g) (g, d ) d f i (g, NIL) (g, g) g a (g, b) (g, g) (g, g) c b (g, b) (g, g) j e (g, b) h (g, e) k Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 15 / 42 Generowanie drzew rozpinajacych ˛ grafu - idea Proces generowania wszystkich drzew rozpinajacych ˛ wymaga dwóch operacji: Jeżeli kolejna krawedź ˛ z listy nie zamyka cyklu (jest zaakceptowana), to dodanie jej powoduje połaczenie ˛ dwóch drzew T 1 i T 2 w jedno nowe drzewo T i w zwiazku ˛ z tym należy dokonać odpowiedniej zmiany etykiet wierzchołków T (Procedura A i B). Po otrzymaniu drzewa rozpinajacego ˛ lub wyczerpaniu sie˛ listy krawedzi ˛ w procesie generowania drzew, wykonujemy krok “powrotu” polegajacy ˛ na wyrzuceniu ostatnio dodanej krawedzi. ˛ Powoduje to rozbicie pewnego drzewa T na dwa poddrzewa T 1 i T 2 (Procedura C). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 16 / 42 Procedura A - pseudokod Zamiana etykiet wierzchołków drzewa T o korzeniu r , po operacji zamiany r na nowy korzeń v. Algorytm NowyKorzeń(v): 1: StaryKorzen := Korzen[v] 2: if StaryKorzen = v then 3: return; 4: end if 5: v1 := 0; v2 := v; 6: repeat 7: p := v1; v1 := v2; v2 := Poprzednik[v1]; Poprzednik[v1] := p; 8: until v1 = StaryKorzen 9: for each w ∈ V do 10: if Korzen[w ] = StaryKorzen then 11: Korzen[w ] = v; 12: end if 13: end for Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 17 / 42 Procedura A - przykład operacja zamiany korzenia g na nowy korzeń i. (g, d) (g, g) d f a i (g, NIL) (g, g) g (g, g) e j (g, b) c b (g, g) e (g, e) (g, b) h (g, e) k Bożena Woźna-Szcześniak (AJD) (g, g) (g, g) (g, b) h i g a (g, b) (g, NIL) (g, g) (g, b) c b (g, g) d f (g, g) (g, g) j (g, d) (g, b) k Algorytmy i Struktury Danych. Wykład 9 18 / 42 Procedura A - przykład, cd. zmieniamy skierowanie krawedzi ˛ na ścieżce z g do i. zmieniamy drugie etykiety wierzchołków (6=i) tej ścieżki. Etykiety pozostałych wierzchołków w drzewie T pozostaja˛ bez zmian. (g, d) (g, g) d f a i (g, NIL) (g, g) g (g, g) e (g, g) (g, b) c b (g, g) d f (g, g) (g, g) j (g, d) (g, b) (g, b) j (g, e) (g, b) h (g, e) k Bożena Woźna-Szcześniak (AJD) c b (g, g) e (g, b) (g, i) (g, g) (g, b) h i g a (g, b) k Algorytmy i Struktury Danych. Wykład 9 19 / 42 Procedura A - przykład, cd. Wszystkie wierzchołki drzewa T otrzymuja˛ pierwsza˛ etykiete˛ (określajac ˛ a˛ korzeń) równa˛ i, a wierzchołek i dostaje druga˛ etykiete˛ postaci (i, NIL). (g, d) (g, g) d f g c b (g, g) e (g, b) (i, g) (i, b) (g, b) h j (i, g) c b e (i, b) (i, i) (i, g) (g, e) (i, b) h (i, e) k Bożena Woźna-Szcześniak (AJD) i g a (i, NIL) (i, g) d f (g, g) (g, g) j (i, d) i (g, NIL) (g, g) a (g, b) k Algorytmy i Struktury Danych. Wykład 9 20 / 42 Procedura B - pseudokod Zamienia etykiety wierzchołków dwóch drzew T 1 i T 2, o korzeniach odpowiednio r 1 i r 2, r 1 < r 2, po operacji ich połaczenia ˛ przez dodanie krawedzi ˛ e = (u, v), gdzie u ∈ V (T 1), v ∈ V (T 2). Algorytm DodajKrawedź ˛ (e = (u, v)): 1: v1 := Korzen[u]; v2 := Korzen[v]; 2: if v2 < v1 then 3: zamien(v1, v2); zamien(u, v); 4: end if 5: NowyKorzen(v); 6: Poprzednik[v] := u; 7: for each w ∈ V do 8: if Korzen[w ] = v2 then 9: Korzen[w ] = v1; 10: end if 11: end for Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 21 / 42 Procedura B - Przykład Połaczenie ˛ dwóch drzew T 1 i T 2, o korzeniach odpowiednio d i m, przez dodanie krawedzi ˛ e = (g, b), gdzie g ∈ V (T 1), b ∈ V (T 2). (d, NIL) (d, d) d f a g e d f a h Bożena Woźna-Szcześniak (AJD) (m, b) h (d, e) (d, g) k c b e (m, m) (m, c) (d, g) j m i g (m, NIL) (m, b) (d, d) (d, g) (m, b) (d, e) (d, g) c b (d, NIL) (d, d) (m, m) (m, c) (d, g) j m i (d, d) (d, g) (m, NIL) (m, b) k Algorytmy i Struktury Danych. Wykład 9 22 / 42 Procedura B - Przykład, cd. wierzchołkom w drzewie T 2 zmieniamy drugie etykiety tak jak przy zamianie korzenia z m na b (Procedura A); w drzewie T1 drugie etykiety wierzchołków pozostaja˛ bez zmian. (d, NIL) (d, d) d f a g e d a h (b, b) c b e (b, b) h (d, e) (d, g) k k Bożena Woźna-Szcześniak (AJD) (b, NIL) (d, g) j m i g (b, c) (b, b) (d, d) (d, g) (m, b) (d, e) (d, g) c b (d, g) j (m, m) (m, c) (d, NIL) (d, d) f m i (d, d) (d, g) (m, NIL) (m, b) Algorytmy i Struktury Danych. Wykład 9 23 / 42 Procedura B - Przykład, cd. wierzchołkowi b jako druga˛ etykiete˛ przypisujemy g. wszystkie wierzchołki drzewa T 2 otrzymuja˛ pierwsza˛ etykiete˛ równa˛ d ; w drzewie T1 pierwsze etykiety wierzchołków pozostaja˛ bez zmian. (d, NIL) (d, d) d f a (b, NIL) g e d f a h (d, b) c b e (d, b) h (d, e) (d, g) k Bożena Woźna-Szcześniak (AJD) (d, g) (d, g) j m i g (d, c) (d, b) (d, d) (d, g) (b, b) (d, e) (d, g) (d, NIL) (d, d) (b, b) c b (d, g) j m i (d, d) (d, g) (b, c) (b, b) k Algorytmy i Struktury Danych. Wykład 9 24 / 42 Procedura C - pseudokod Zamiania etykiet wierzchołków drzewa T o korzeniu r po usunieciu ˛ z niego krawedzi ˛ e = (u, v), czyli rozbiciu T na dwa drzewa T 1 i T 2, gdzie u ∈ V (T 1), v ∈ V (T 2) i r ∈ V (T 1). UWAGA! W naszym przypadku zawsze usuwamy ostatnio dodana˛ krawedź, ˛ wiec ˛ wierzchołek u jest wierzchołkiem wiszacym ˛ i po usunieciu ˛ krawedzi ˛ stanie sie˛ drzewem trywialnym (jednowierzchołkowym). Zatem proces usuniecia ˛ krawedzi ˛ polega jedynie na zmianie atrybutów wierzchołka u. Realizuje to algorytm UsuńKrawedź. ˛ Algorytm UsuńKrawedź(e=(u,v)): ˛ 1: if Poprzednik[u] = v then 2: zamien(u, v) 3: end if 4: Poprzednik[v] := 0; 5: Korzen[v] = v; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 25 / 42 Procedura C - Przykład W drzewie T 1 obie etykiety wierzchołków pozostaja˛ bez zmian. Wierzchołkowi b przypisujemy etykiete˛ (b, 0) (staje sie˛ korzeniem drzewa T 2). Drugie etykiety pozostałych wierzchołków w drzewie T 2 pozostaja˛ bez zmian, ale otrzymuja˛ pierwsza˛ etykiete˛ równa˛ b. (d, NIL) (d, d) d f (d, d) (d, g) a g (d, g) e a h (b, b) c b e (b, b) h (d, e) (d, g) k k Bożena Woźna-Szcześniak (AJD) (b, NIL) (d, g) j m i g (b, c) (b, b) (d, d) (d, g) (d, b) (d, e) (d, g) d f (d, b) c b (d, g) j m i (d, NIL) (d, d) (d, c) (d, b) Algorytmy i Struktury Danych. Wykład 9 26 / 42 Procedura C - Przykład, cd. Usuniecie ˛ kraw˛edzi (g, b). (d, NIL) (d, d) d f a (b, NIL) (d, d) (d, g) g e a h (b, b) c b e (b, b) h (d, e) (d, g) k Bożena Woźna-Szcześniak (AJD) (b, NIL) (d, g) j m i g (b, c) (b, b) (d, d) (d, g) (b, b) (d, e) (d, g) d f (b, b) c b (d, g) j m i (d, NIL) (d, d) (b, c) (b, b) k Algorytmy i Struktury Danych. Wykład 9 27 / 42 Algorytm generowania wszystkich drzew rozpinajacych ˛ grafu Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 28 / 42 Znaleźć wszystkie drzewa rozpiete ˛ grafu b g f v3 e d c v1 v5 v4 a v2 Bożena Woźna-Szcześniak (AJD) a, ab, abc, abd, abde, abdf, abdg, abef, abeg, abfg, abg, ac, acd, acde, acdf, acdg, ace, acef, aceg, acf, acfg, acg, ad, ade, adef, adeg, adf, adfg, adg, aef, aefg, aeg, af, afg, ag, b, bc, bcd, bcde, bcdf, bcdg, bce, bcef, bceg, bcf, bcfg, bcg, bd, bde, bdef, bdeg, bdf, bdfg, bdg, be, bef, befg, beg, bf, bfg, bg, c. Algorytmy i Struktury Danych. Wykład 9 29 / 42 Drzewa rozpinajace ˛ o minimalnej wadze Jeżeli mamy do czynienia z grafem z wagami, to najcz˛eściej interesuje nas znalezienie drzewa rozpinajacego ˛ o minimalnej wadze, tzn., drzewa z najmniejsza˛ suma˛ wag jego krawedzi. ˛ Aby znaleźć drzewo o żadanych ˛ własnościach można zastosować dwa algorytmy: Kruskala (algorytm zachłanny) Prima (algorytm najbliższego sasiada). ˛ Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 30 / 42 Algorytmy Kruskala Algorytm jest oparty o metode˛ zachłanna˛ i polega na łaczeniu ˛ wielu poddrzew w jedno za pomoca˛ krawedzi ˛ o najmniejszej wadze. Wybierz krawedź ˛ (która nie jest petl ˛ a) ˛ e1 tak, by waga tej krawedzi ˛ była najmniejsza. Jeżeli krawedzie ˛ e1 , e2 , . . ., ek zostały już wybrane, to z pozostałych E \ {e1 , e2 , . . . , ek } wybierz krawedź ˛ ek +1 w taki sposób aby: graf, który składa sie˛ tylko z kraw˛edzi e1 , e2 , . . ., ek , ek +1 był acykliczny, oraz waga kraw˛edzi ek +1 była najmniejsza. Jeśli nie można wykonać kroku 2, to STOP. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 31 / 42 Algorytm Kruskala - Złożoność obliczeniowa Algorytm można podzielić na dwa etapy: w pierwszym etapie sortujemy kraw˛edzie według wag w czasie O(m · log(m)). w drugim etapie budujemy rozpiete ˛ drzewo poprzez wybór najkrótszych kraw˛edzi ze zbioru kraw˛edzi E(G); ten etap można wykonać w czasie O(m · log(n)). Sumaryczny czas pracy algorytmu Kruskala wynosi: O(m · log(n)) Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 32 / 42 Algorytm Kruskala - Przykład 4 a 2 b c 1 2 8 2 7 f e 3 d Po posortowaniu krawedzi ˛ wg. wag otrzymujemy: ae=1 , af=2 , bc=2 , be=2 , de=3 , ab=4 , fd=6 , ef=7 , cd=8 6 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 33 / 42 Algorytm Kruskala - Przykład Krok 1. Krok 2. 4 a 2 b c 4 a 1 8 2 f c 1 2 7 2 b e 2 7 d f 6 Bożena Woźna-Szcześniak (AJD) 8 2 3 e 3 d 6 Algorytmy i Struktury Danych. Wykład 9 34 / 42 Algorytm Kruskala - Przykład Krok 3. 4 a 2 b Krok 4 - scalenie. 4 a b c 8 2 f c 1 1 2 7 2 e 2 7 d f e 3 d 6 6 Bożena Woźna-Szcześniak (AJD) 8 2 3 Algorytmy i Struktury Danych. Wykład 9 35 / 42 Algorytm Kruskala - Przykład Krok 5. 4 a 2 b Minimalne drzewo. c 1 2 8 2 7 f 2 a e 3 d b c 1 2 2 f e 3 d 6 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 36 / 42 Algorytm Prima Algorytm ten jest, podobnie jak algorytm Kruskala oparty o metode˛ zachłanna. ˛ Budowe˛ minimalnego drzewa rozpinajacego ˛ zaczynamy od dowolnego wierzchołka, np. od pierwszego. Dodajemy wierzchołek do drzewa, a wszystkie krawedzie ˛ incydentne umieszczamy na posortowanej wg. wag liście. Nastepnie ˛ zdejmujemy z listy pierwszy element (o najmniejszej wadze) i jeżeli wierzchołek, który łaczy ˛ nie należy do drzewa, dodajemy go do drzewa a na liście znów umieszczamy wszystkie krawedzie ˛ incydentne z wierzchołkiem, który dodaliśmy. Jednym zdaniem: zawsze dodajemy do drzewa krawedź ˛ o najmniejszej wadze, osiagaln ˛ a˛ (w przeciwieństwie do Kruskala) z jakiegoś wierzchołka tego drzewa. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 37 / 42 Algorytm Prima - Przykład 4 a 2 b c 1 2 8 2 7 f e 3 d 6 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 38 / 42 Algorytm Prima - Przykład Krok 1. Krok 2. 4 a 2 b c 4 a 1 8 2 f c 1 2 7 2 b e 2 7 d f 6 Bożena Woźna-Szcześniak (AJD) 8 2 3 e 3 d 6 Algorytmy i Struktury Danych. Wykład 9 39 / 42 Algorytm Prima - Przykład Krok 3. Krok 4 4 a 2 b 4 a c 8 2 f c 1 1 2 7 2 b e 2 7 d f e 3 d 6 6 Bożena Woźna-Szcześniak (AJD) 8 2 3 Algorytmy i Struktury Danych. Wykład 9 40 / 42 Algorytm Prima - Przykład Krok 5. 4 a 2 b Minimalne Drzewo c 1 2 8 2 7 f 2 a e 3 d b c 1 2 2 f e 3 d 6 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 9 41 / 42 Algorytm Prima a Algorytm Kruskala - Przykład Minimalne Drzewo wg. Algorytmu Kruskala. 2 a c b Minimalne Drzewo wg. Algorytmu Prima 2 a c b 1 1 2 2 2 f e 2 3 Bożena Woźna-Szcześniak (AJD) d f Algorytmy i Struktury Danych. e 3 d Wykład 9 42 / 42