Minimalne drzewa rozpinające
description
Transcript of Minimalne drzewa rozpinające
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.
48 7
9
14
10
21
11 2
7
8
46
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
1 A :=
2 while A nie tworzy drzewa rozpinającego
3 do znajdź krawędź (u, v), która jest bezpieczna dla A
4 A := A {(u, v)}
5 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.
4
8 79
14
10
21
112
7
8
46
u
v
x
y
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 do if Find-Set(u) Find-Set(v)
7 then A := A {(u,v)}
8 Union(u,v)
9 return A
Algorytm Kruskala (przykład)4
8 79
14
10
21
11 27
8
46
48 7
9
14
10
21
11 27
8
46
48 7
9
14
10
21
11 27
8
46
48 7
9
14
10
21
11 27
8
46
21
48 7
9
10
11 27
8
46
48 7
9
14
10
21
11 27
8
46
Algorytm PrimaMST-Prim(G, w, r)
1 Q := V[G]
2 for każdy uQ
3 do key[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)
Algorytm Prima (przykład)8 7
4 9
14
10
21
11 27
8
46
48 7
9
14
10
21
11 27
8
46
48 7
9
14
10
21
11 27
8
46
48 7
9
14
10
21
11 27
8
46
21
48 7
9
10
11 27
8
46
8 7
21
4 9
14
10
11 27
8
46