Minimum Spanning Tree (分析)

Minimum Spanning Trees
有權重的圖
a
G=(V,E)
b
3
1
4
5
1
5
c
9 d
3
f
2
e
7
2
g
4
h
很多圖形演算法的問題都假設其輸入為有權重
的圖形.
這裡我們假設權重都定在邊上面, 且權重值都
為正, 例如請參考上圖所顯示的圖形.
Minimum Spanning Trees
2
Minimum Spanning Trees (MST)
 Find the lowest-cost way to connect all of the points
(the cost is the sum of weights of the selected edges).
 The solution must be a tree. (Why ?)
 A spanning tree : a subgraph that is a tree and
connect all of the points.
 A graph may contains exponential number of
spanning trees.
(e.g. # spanning trees of a complete graph = nn-2.)
Minimum Spanning Trees
3
A High-Level Greedy Algorithm for MST
A = ;
while(T=(V,A) is not a spanning tree of G) {
select a safe edge for A ;
}
 The algorithm grows a MST one edge at a time and
maintains that A is always a subset of some MST.
 An edge is safe if it can be safely added to without
destroying the invariant.
 How to check that T is a spanning tree of G ?
 How to select a “safe edge” edge ?
Minimum Spanning Trees
4
MST 基本引理
Let V = V1 + V2, (V1,V2 ) = {uv | u  V1& v  V2 }.
if xy  (V1,V2 ) and w(xy) = min {w(uv)| uv 
(V1,V2 )}, then xy is contained in a MST.
a


V1
b
3
1
4
5
1
5
c
9 d
3
f
2
e
7
2
g
4
h
V2
Minimum Spanning Trees
5
Kruskal’s Algorithm (pseudo code 1)
A= ;
for( each edge in order by nondecreasing weight )
if( adding the edge to A doesn't create a cycle ){
add it to A;
if( |A| == n1 ) break;
}
 How to check that adding an edge does not create a
cycle?
Minimum Spanning Trees
6
Kruskal’s Algorithm (例 1/3)
b
3
a
4
5
1
1
4
c
9
d
3
f
2
e
7
2
g
Minimum Spanning Trees
4
h
7
Kruskal’s Algorithm (例 2/3)
b
3
a
4
5
1
1
4
c
9
d
3
f
2
e
7
2
g
Minimum Spanning Trees
4
h
8
Kruskal’s Algorithm (例 3/3)
b
3
a
4
5
1
1
4
c
9
d
3
f
2
e
7
2
g
4
h
MST cost = 17
Minimum Spanning Trees
9
Kruskal’s Algorithm (pseudo code 2)
A = ; initial(n); // for each node x construct a set {x}
for( each edge xy in order by nondecreasing weight)
if ( ! find(x, y) ) {
union(x, y);
add xy to A;
if( |A| == n1 ) break;
}
find(x, y) = true iff. x and y are in the same set
union(x, y): unite the two sets that contain x
and y, respectively.
Minimum Spanning Trees
10
Prim’s Algorithm (pseudo code 1)
ALGORITHM Prim(G)
// Input: A weighted connected graph G=(V,E)
// Output: A MST T=(V, A)
VT  { v0 } // Any vertex will do;
A  ;
for i  1 to |V|1 do
find an edge xy  (VT, VVT ) s.t. its weight is
minimized among all edges in (VT, VVT );
VT  VT  { y } ; A  A  { xy } ;
Minimum Spanning Trees
11
Prim’s Algorithm (例 1/8)
b
3
a
4
5
1
1
4
c
9
d
3
f
2
e
7
2
g
Minimum Spanning Trees
4
h
12
Prim’s Algorithm (例 2/8)
b
3
a
4
5
1
1
4
c
9
d
3
f
2
e
7
2
g
Minimum Spanning Trees
4
h
13
Prim’s Algorithm (例 3/8)
b
3
a
4
5
1
1
4
c
9
d
3
f
2
e
7
2
g
Minimum Spanning Trees
4
h
14
Prim’s Algorithm (例 4/8)
b
3
a
4
5
1
1
4
c
9
d
3
f
2
e
7
2
g
Minimum Spanning Trees
4
h
15
Prim’s Algorithm (例 5/8)
b
3
a
4
5
1
1
4
c
9
d
3
f
2
e
7
2
g
Minimum Spanning Trees
4
h
16
Prim’s Algorithm (例 6/8)
b
3
a
4
5
1
1
4
c
9
d
3
f
2
e
7
2
g
Minimum Spanning Trees
4
h
17
Prim’s Algorithm (例 7/8)
b
3
a
4
5
1
1
4
c
9
d
3
f
2
e
7
2
g
Minimum Spanning Trees
4
h
18
Prim’s Algorithm (例 8/8)
b
3
a
4
5
1
1
4
c
9
d
3
f
2
e
7
2
g
4
h
MST cost = 17
Minimum Spanning Trees
19
Prim’s Algorithm (pseudo code 2)
Built a priority queue Q for V with key[u] =   uV;
key[v0] = 0; [v0] = Nil; // Any vertex will do
While (Q  ) {
u = Extract-Min(Q);
for( each v  Adj(u) )
if (v  Q && w(u, v) < key[v] ) {
[v] = u;
key[v] = w(u, v);
Change-Priority(Q, v, key[v]);
}
}
Minimum Spanning Trees
20
Minimum Spanning Tree (分析)
Let n = |V(G)|, m =|E(G)|.
Execution time of Kruskal’s algorithm: (use
union-find operations, or disjoint-set unions)
O(m log m ) = O(m log n )
Running time of Prim’s algorithm:
 adjacency lists + (binary or ordinary) heap:
O((m+n) log n ) = O(m log n )
 adjacency matrix + unsorted list: O(n2)
 adjacency lists + Fibonacci heap:
O(n log n + m)
Minimum Spanning Trees
21