210 likes | 226 Views
Learn about the Minimum Spanning Trees algorithm and how to find the lowest-cost way to connect all points in a weighted graph. Explore Kruskal's and Prim's algorithms.
E N D
b 3 4 f a 5 2 1 1 e 5 7 2 c 9 d 3 g h 4 有權重的圖 G=(V,E) • 很多圖形演算法的問題都假設其輸入為有權重的圖形. • 這裡我們假設權重都定在邊上面, 且權重值都為正, 例如請參考上圖所顯示的圖形. Minimum Spanning Trees
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
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 issafeif 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
b 3 4 f a 5 2 1 1 e 5 7 2 c 9 d 3 g h 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. V2 V1 Minimum Spanning Trees
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| == n1 ) break; } • How to check that adding an edge does not create a cycle? Minimum Spanning Trees
3 4 5 2 1 1 4 7 2 9 3 4 Kruskal’s Algorithm (例 1/3) b f a e c d g h Minimum Spanning Trees
3 4 5 2 1 1 4 7 2 9 3 4 Kruskal’s Algorithm(例 2/3) b f a e c d g h Minimum Spanning Trees
3 4 5 2 1 1 4 7 2 9 3 4 Kruskal’s Algorithm(例 3/3) b f a e c d g h MST cost = 17 Minimum Spanning Trees
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| == n1 ) 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
Prim’s Algorithm(pseudo code 1) ALGORITHMPrim(G) // Input: A weighted connected graphG=(V,E) // Output: A MSTT=(V, A) VT { v0} // Any vertex will do; A ; for i 1to |V|1do find an edge xy (VT, VVT) s.t. its weight is minimized among all edges in(VT, VVT); VT VT { y} ; A A { xy} ; Minimum Spanning Trees
3 4 5 2 1 1 4 7 2 9 3 4 Prim’s Algorithm (例 1/8) b f a e c d g h Minimum Spanning Trees
3 4 5 2 1 1 4 7 2 9 3 4 Prim’s Algorithm (例 2/8) b f a e c d g h Minimum Spanning Trees
3 4 5 2 1 1 4 7 2 9 3 4 Prim’s Algorithm (例 3/8) b f a e c d g h Minimum Spanning Trees
3 4 5 2 1 1 4 7 2 9 3 4 Prim’s Algorithm (例 4/8) b f a e c d g h Minimum Spanning Trees
3 4 5 2 1 1 4 7 2 9 3 4 Prim’s Algorithm (例 5/8) b f a e c d g h Minimum Spanning Trees
3 4 5 2 1 1 4 7 2 9 3 4 Prim’s Algorithm (例 6/8) b f a e c d g h Minimum Spanning Trees
3 4 5 2 1 1 4 7 2 9 3 4 Prim’s Algorithm (例 7/8) b f a e c d g h Minimum Spanning Trees
3 4 5 2 1 1 4 7 2 9 3 4 Prim’s Algorithm (例 8/8) b f a e c d g h MST cost = 17 Minimum Spanning Trees
Prim’s Algorithm (pseudo code 2) Built a priority queue Q for V with key[u] = uV; 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
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 logm ) = O(m logn ) • Running time of Prim’s algorithm: • adjacency lists + (binary or ordinary) heap: O((m+n)logn ) = O(m logn ) • adjacency matrix + unsorted list: O(n2) • adjacency lists + Fibonacci heap: O(n logn + m) Minimum Spanning Trees