Minimalne drzewa rozpięte Algorytm Kruskala Algorytm Prima Poprawność i złożoność
Algorytmy Grafowe
Rozdział 2. Minimalne drzewa rozpięte.
Katarzyna Rybarczyk-Krzywdzińska
Minimalne drzewa rozpięte Algorytm Kruskala Algorytm Prima Poprawność i złożoność
Minimalne drzewa rozpięte
Drzewa – definicje
Definicja
Lasemnazywamy graf bez cykli (jako podgrafów).
Definicja
Drzewemnazywamy spójny las.
Definicja
Drzewem rozpiętymgrafu G nazywamy podgraf H grafu G , który jest drzewem i dla którego V (H) = V (G ).
Przykład:
Minimalne drzewa rozpięte Algorytm Kruskala Algorytm Prima Poprawność i złożoność
Minimalne drzewa rozpięte
Drzewa – własności
Twierdzenie Własności drzew:
W drzewie każda krawędź jest krawędzią cięcia.
Drzewo na n wierzchołkach ma n − 1 krawędzi.
Każde nietrywialne drzewo (o co najmniej 2 wierzchołkach) ma co najmniej dwa wierzchołki wiszące (z których wychodzi tylko jedna krawędź).
Każdy graf spójny ma drzewo rozpięte.
Uzasadnienie:
Minimalne drzewa rozpięte Algorytm Kruskala Algorytm Prima Poprawność i złożoność
Minimalne drzewa rozpięte
Drzewa z wagami
Definicja
Wagą drzewaz wagami T o funkcji wag w nazywamy sumę wag jego krawędzi:
w (T ) = X
e∈E (T )
w (e).
Definicja
Minimalnym drzewem rozpiętym (MST)spójnego grafu G nazywamy drzewo rozpięte T o najmniejszej wadze.
Przykład:
Minimalne drzewa rozpięte Algorytm Kruskala Algorytm Prima Poprawność i złożoność
Minimalne drzewa rozpięte
Zastosowania:
rozsyłanie (np. informacji) w sieciach, w których połączenia mają różny „koszt” przekazu (wyznacza sieć połączeń, które minimalizują koszt przekazu);
pomoc przy aproksymacji niektórych problemów klasy NP (np.
problem podróżującego komiwojażera – o tym niebawem);
analiza skupień (cluster analysis);
rozpoznawanie obrazów;
...
Minimalne drzewa rozpięte Algorytm Kruskala Algorytm Prima Poprawność i złożoność
Minimalne drzewa rozpięte
Zastosowania:
Pewna osada ma ograniczone zasoby finansowe i wszystkie drogi w tragicznym stanie. Które z dróg powinny zastać naprawione, aby zapewnić dojazd wyremontowanymi drogami do każdego istotnego punktu osady i zminimalizować koszty?
Minimalne drzewa rozpięte Algorytm Kruskala Algorytm Prima Poprawność i złożoność
Algorytm Kruskala
Algorytm Kruskala
Działanie algorytmu Kruskala:
W każdym kroku wybieramy w grafie G = (V , E ) nową krawędź o najmniejszej wadze (jeśli jest ich kilka to wybieramy dowolną z nich).
Jeżeli krawędź nie zamyka żadnego cyklu to dodajemy ją do lasu, w przeciwnym razie odrzucamy.
Proces kontynuujemy do momentu, aż wybierzemy |V | − 1 krawędzi, które utworzą rozpięte drzewo grafu.
Do szybkiego rozpoznawania, czy krawędź zamyka cykl możemy wykorzystać technikę z atrybutami wierzchołkówKorzeń
.
Minimalne drzewa rozpięte Algorytm Kruskala Algorytm Prima Poprawność i złożoność
Algorytm Kruskala
Algorytm Kruskala
Działanie algorytmu Kruskala:
W każdym kroku wybieramy w grafie G = (V , E ) nową krawędź o najmniejszej wadze (jeśli jest ich kilka to wybieramy dowolną z nich).
Jeżeli krawędź nie zamyka żadnego cyklu to dodajemy ją do lasu, w przeciwnym razie odrzucamy.
Proces kontynuujemy do momentu, aż wybierzemy |V | − 1 krawędzi, które utworzą rozpięte drzewo grafu.
Do szybkiego rozpoznawania, czy krawędź zamyka cykl możemy wykorzystać technikę z atrybutami wierzchołkówKorzeń
.
Minimalne drzewa rozpięte Algorytm Kruskala Algorytm Prima Poprawność i złożoność
Algorytm Kruskala
Algorytm Kruskala
Działanie algorytmu Kruskala:
W każdym kroku wybieramy w grafie G = (V , E ) nową krawędź o najmniejszej wadze (jeśli jest ich kilka to wybieramy dowolną z nich).
Jeżeli krawędź nie zamyka żadnego cyklu to dodajemy ją do lasu, w przeciwnym razie odrzucamy.
Proces kontynuujemy do momentu, aż wybierzemy |V | − 1 krawędzi, które utworzą rozpięte drzewo grafu.
Do szybkiego rozpoznawania, czy krawędź zamyka cykl możemy wykorzystać technikę z atrybutami wierzchołkówKorzeń
.
Minimalne drzewa rozpięte Algorytm Kruskala Algorytm Prima Poprawność i złożoność
Algorytm Kruskala
Algorytm Kruskala
Działanie algorytmu Kruskala:
W każdym kroku wybieramy w grafie G = (V , E ) nową krawędź o najmniejszej wadze (jeśli jest ich kilka to wybieramy dowolną z nich).
Jeżeli krawędź nie zamyka żadnego cyklu to dodajemy ją do lasu, w przeciwnym razie odrzucamy.
Proces kontynuujemy do momentu, aż wybierzemy |V | − 1 krawędzi, które utworzą rozpięte drzewo grafu.
Do szybkiego rozpoznawania, czy krawędź zamyka cykl możemy wykorzystać technikę z atrybutami wierzchołkówKorzeń.
Minimalne drzewa rozpięte Algorytm Kruskala Algorytm Prima Poprawność i złożoność Algorytm Kruskala
Algorytm Kruskala - przykład
Minimalne drzewa rozpięte Algorytm Kruskala Algorytm Prima Poprawność i złożoność
Algorytm Kruskala
Algorytm Kruskala
1 Wybierz krawędź e1, która nie jest pętlą, tak, by waga tej krawędzi była najmniejsza.
2 Jeżeli krawędzie e1, e2, . . . , ek zostały już wybrane, to z pozostałych E \ {e1, e2, . . . , ek} wybierz krawędź ek+1 w taki sposób aby:
a. waga krawędzi ek+1 była najmniejsza oraz
b. graf, który składa się tylko z krawędzi e1, e2, . . . , ek, ek+1 był acykliczny (możemy tu zastosować etykietowanie związane z korzeniami drzew lasu).
3 Jeśli nie można wykonać kroku 2, to STOP (dla grafu
spójnego: gdy wybrałeś już |V | − 1 krawędzi lub gdy wszystkie wierzchołki mają ten sam korzeń).
Minimalne drzewa rozpięte Algorytm Kruskala Algorytm Prima Poprawność i złożoność
Algorytm Kruskala
Algorytm Kruskala
1 Wybierz krawędź e1, która nie jest pętlą, tak, by waga tej krawędzi była najmniejsza.
2 Jeżeli krawędzie e1, e2, . . . , ek zostały już wybrane, to z pozostałych E \ {e1, e2, . . . , ek} wybierz krawędź ek+1 w taki sposób aby:
a. waga krawędzi ek+1 była najmniejsza oraz
b. graf, który składa się tylko z krawędzi e1, e2, . . . , ek, ek+1 był acykliczny (możemy tu zastosować etykietowanie związane z korzeniami drzew lasu).
3 Jeśli nie można wykonać kroku 2, to STOP (dla grafu
spójnego: gdy wybrałeś już |V | − 1 krawędzi lub gdy wszystkie wierzchołki mają ten sam korzeń).
Minimalne drzewa rozpięte Algorytm Kruskala Algorytm Prima Poprawność i złożoność
Algorytm Kruskala
Algorytm Kruskala
1 Wybierz krawędź e1, która nie jest pętlą, tak, by waga tej krawędzi była najmniejsza.
2 Jeżeli krawędzie e1, e2, . . . , ek zostały już wybrane, to z pozostałych E \ {e1, e2, . . . , ek} wybierz krawędź ek+1 w taki sposób aby:
a. waga krawędzi ek+1 była najmniejsza oraz
b. graf, który składa się tylko z krawędzi e1, e2, . . . , ek, ek+1 był acykliczny (możemy tu zastosować etykietowanie związane z korzeniami drzew lasu).
3 Jeśli nie można wykonać kroku 2, to STOP (dla grafu
spójnego: gdy wybrałeś już |V | − 1 krawędzi lub gdy wszystkie wierzchołki mają ten sam korzeń).
Minimalne drzewa rozpięte Algorytm Kruskala Algorytm Prima Poprawność i złożoność
Algorytm Kruskala
Algorytm Kruskala
1 Wybierz krawędź e1, która nie jest pętlą, tak, by waga tej krawędzi była najmniejsza.
2 Jeżeli krawędzie e1, e2, . . . , ek zostały już wybrane, to z pozostałych E \ {e1, e2, . . . , ek} wybierz krawędź ek+1 w taki sposób aby:
a. waga krawędzi ek+1 była najmniejsza oraz
b. graf, który składa się tylko z krawędzi e1, e2, . . . , ek, ek+1 był acykliczny (możemy tu zastosować etykietowanie związane z korzeniami drzew lasu).
3 Jeśli nie można wykonać kroku 2, to STOP (dla grafu
spójnego: gdy wybrałeś już |V | − 1 krawędzi lub gdy wszystkie wierzchołki mają ten sam korzeń).
Minimalne drzewa rozpięte Algorytm Kruskala Algorytm Prima Poprawność i złożoność
Algorytm Kruskala
Algorytm Kruskala
1 Wybierz krawędź e1, która nie jest pętlą, tak, by waga tej krawędzi była najmniejsza.
2 Jeżeli krawędzie e1, e2, . . . , ek zostały już wybrane, to z pozostałych E \ {e1, e2, . . . , ek} wybierz krawędź ek+1 w taki sposób aby:
a. waga krawędzi ek+1 była najmniejsza oraz
b. graf, który składa się tylko z krawędzi e1, e2, . . . , ek, ek+1 był acykliczny (możemy tu zastosować etykietowanie związane z korzeniami drzew lasu).
3 Jeśli nie można wykonać kroku 2, to STOP (dla grafu
spójnego: gdy wybrałeś już |V | − 1 krawędzi lub gdy wszystkie wierzchołki mają ten sam korzeń).
Minimalne drzewa rozpięte Algorytm Kruskala Algorytm Prima Poprawność i złożoność
Algorytm Kruskala
Procedura nawadnia korzeni w algorytmie Kruskala:
1 Na początku każdemu wierzchołkowi v nadajemy korzeń r (v ) = v ;
2 Gdy rozważamy krawędź vw :
jeżeli r (v ) = r (w ), to krawędź vw zamyka cykl;
jeżeli r (v ) 6= r (w ) (krawędź vw nie zamyka cyklu), w algorytmie Kruskala łączymy drzewa o korzeniach r (v ) i r (w ) krawędzią vw , zatem nadajemy wszystkim wierzchołkom o korzeniu r (w ) nowy korzeń r (v ).
Minimalne drzewa rozpięte Algorytm Kruskala Algorytm Prima Poprawność i złożoność
Algorytm Prima
Algorytm Prima
W trakcie działania algorytmu budujemy drzewo zaczynając od pewnego wierzchołka s.
W każdym kroku dla każdego wierzchołka v połączonego krawędzią z budowanym drzewem mamy zapisane:
wagę „najlżejszej” krawędzi łączącej v z drzewem (β(v ));
wierzchołek tej krawędzi należący do drzewa (α(v ))
Następnie wybieramy wierzchołek v z poza drzewa położony
„najbliżej” budowanego drzewa (o najmniejszym β(v )) i dodajemy go do drzewa (dodajemy krawędź α(v )v).
Minimalne drzewa rozpięte Algorytm Kruskala Algorytm Prima Poprawność i złożoność Algorytm Prima
Algorytm Prima - przykład
Minimalne drzewa rozpięte Algorytm Kruskala Algorytm Prima Poprawność i złożoność
Algorytm Prima
Algorytm Prima
1 Wybrać s – dowolny wierzchołek grafu G = (V , E ).
Przypisać s etykiety: (α(s), β(s)) = (None, 0).
T := ∅ – zbiór wierzchołków budowanego drzewa;
Pozostałym wierzchołkom v przypisać etykiety (α(v ), β(v )) = (None, ∞)
α(v ) – aktualny poprzednik wierzchołka w budowanym drzewie β(v ) – waga krawędzi wiodącej do aktualnego poprzednika.
2 Powtarzamy
Wybrać wierzchołek v taki, że β(v ) = min
u /∈Tβ(u) T := T ∪ {v }. Jeżeli |T | = |V |, to STOP.
Wszystkim wierzchołkom u przyległym do v , które nie należą do T i dla których zachodzi nierówność
β(u) > w (v , u) zmieniamy etykiety
α(u) := v , β(u) := w (v , u).
Minimalne drzewa rozpięte Algorytm Kruskala Algorytm Prima Poprawność i złożoność
Algorytm Prima
Algorytm Prima
1
2 Powtarzamy
Wybrać wierzchołek v taki, że
β(v ) = min
u /∈Tβ(u)
T := T ∪ {v }. Jeżeli |T | = |V |, to STOP.
Wszystkim wierzchołkom u przyległym do v , które nie należą do T i dla których zachodzi nierówność
β(u) > w (v , u) zmieniamy etykiety
α(u) := v , β(u) := w (v , u).
Minimalne drzewa rozpięte Algorytm Kruskala Algorytm Prima Poprawność i złożoność
Algorytm Prima
Algorytm Prima
Odczytanie krawędzi drzewa z etykiet:
α(v ) – aktualny poprzednik wierzchołka w budowanym drzewie β(v ) – waga krawędzi wiodącej do aktualnego poprzednika.
Dla v 6= s, każda para {α(v ), v } jest krawędzią drzewa.
Minimalne drzewa rozpięte Algorytm Kruskala Algorytm Prima Poprawność i złożoność
Poprawność i złożoność
Dowód poprawności - wstęp
Definicja
Niech G = (V , E ) będzie grafem, S V , S 6= ∅.Cięciem
e(S , V \ S )grafu G nazywamy zbiór krawędzi o jednym końcu w S a drugim w S \ V .
e(S , V \ S ) = {{v , w } ∈ E (G ) : v ∈ S , w ∈ V \ S }
Definicja
W grafie z wagami G krawędź e ∈ e(S , V \ S ) jestlekka, jeśli jej waga jest najmniejsza spośród wag krawędzi z e(S , V \ S ).
UWAGA: Cięcie może zawierać więcej niż jedną lekką krawędź.
Minimalne drzewa rozpięte Algorytm Kruskala Algorytm Prima Poprawność i złożoność
Poprawność i złożoność
Dowód poprawności - lemat
Lemat Niech
G będzie spójnym grafem z wagami grafem;
A ⊆ E (T ) dla pewnego minimalnego drzewa rozpiętego T grafu G ;
e(S , V \ S ) będzie cięciem, które nie zawiera żadnej krawędzi z A;
e ∈ e(S , V \ S ) będzie lekką krawędzią z e(S , V \ S ).
Wtedy A ∪ {e} jest zawarte w pewnym minimalnym drzewie rozpiętym grafu G .
UWAGA: minimalne drzewo rozpięte z tezy nie musi być tym samym minimalnym drzewem rozpiętym T z założeń.
DOWÓD: