90 likes | 306 Views
8. 7. 4. 9. 2. 14. 11. 7. 4. 6. 10. 8. 1. 2. Minimalne drzewa rozpinające.
E N D
8 7 4 9 2 14 11 7 4 6 10 8 1 2 Minimalne drzewa rozpinające Podgraf T spójnego grafu G nazywa się jego drzewem rozpinającym, jeśli T jest acykliczny i łączy wszystkie wierzchołki G. Jeśli krawędziom przypisane są wagi, i suma wag krawędzi T jest minimalna, T nazywamy minimalnym drzewem rozpinającym. Przykład minimalnego drzewa rozpinającego
Minimalne drzewa rozpinające (algorytm ogólny) Podczas wykonywania algorytmu jest utrzymywany zbiór A – podzbiór minimalnego drzewa rozpinającego. W każdym kroku algorytmu jest wyznaczana krawędź, którą można dodać do A bez naruszenia tego niezmiennika. Taką krawędź nazywamy krawędzią bezpieczną. Generic-MST • A := • whileA nie tworzy drzewa rozpinającego • do znajdź krawędź (u, v), która jest bezpieczna dla A • A := A {(u, v)} • return A
Przekroje Przekrojem (S, V-S) grafu nieskierowanego nazywamy podział V na zbiory S i V-S. Krawędź (u, v) E krzyżuje się z przekrojem (S, V-S), jeśli jeden z jej końców należy do S, a drugi do V-S. Przekrój uwzględnia zbiór krawędzi A, jeśli żadna z krawędzi A nie krzyżuje się z tym przekrojem. Krawędź krzyżująca się z przekrojem jest krawędzią lekką, jeśli jej waga jest najmniejsza sposród wszystkich wag krawędzi krzyżujących się z tym przekrojem.
x u y v 8 7 9 4 2 14 11 7 4 6 10 8 1 2
Twerdzenie o bezpiecznej krawędzi Niech G = (V, E) będzie spójnym grafem nieskierowanym z funkcją wagową w i o wartościach rzeczywistych określoną na E. Niech A będzie podzbiorem E zawartym w pewnym minimalnym drzewie rozpinającym grafu G, niech (S, V-S) będzie dowolnym przekrojem G uwzględniającym A i niech (u, v) będzie krawędzią lekką krzyżującą się z (S, V-S). Wtedy krawędź (u, v) jest bezpieczna dla A.
Algorytm Kruskala MST-Kruskal(G, w) 1 A := 2 for każdy wierzchołek vV[G] 3 do Make-Set(v) 4 posortuj krawędzie z E niemalejąco względem wag w 5 for każda krawędź (u,v) E, w kolejności niemalejących wag 6 doif Find-Set(u) Find-Set(v) 7 then A := A {(u,v)} 8 Union(u,v) 9 return A
8 7 8 7 4 9 4 9 2 14 2 14 11 11 7 4 7 4 6 6 10 10 8 8 1 2 1 2 8 7 8 7 4 9 4 9 2 14 2 11 11 7 4 7 4 6 6 10 10 8 8 1 2 8 7 8 7 4 9 4 9 2 14 2 14 11 11 7 4 7 4 6 6 10 10 8 8 1 2 1 2 Algorytm Kruskala (przykład) 1 2
Algorytm Prima MST-Prim(G, w, r) 1 Q := V[G] 2 for każdy uQ 3 dokey[u] := 4 key[r] := 0 5 [r] := NIL 6 while Q 7 do u := Extract-Min(Q) 8 for każdy v Adj[u] 9 do if vQ i w(u,v) < key[v] 10 then [v] := u 11 key[v] := w(u,v)
8 7 4 9 4 9 2 14 2 14 11 11 7 4 7 4 6 6 10 10 8 8 1 2 1 2 8 7 8 7 4 9 4 9 2 14 2 11 11 7 4 7 4 6 6 10 10 8 8 1 2 1 2 8 7 4 9 4 9 2 14 2 14 11 11 7 4 7 4 6 6 10 10 8 8 1 2 Algorytm Prima (przykład) 8 7 8 7 1 2