Course
可以參考我做的課程簡報:
MST & Shortest Path
Minimum Spanning Tree 最小生成樹
最小生成樹
求出無向圖的其中一棵最小生成樹
若是圖不連通,則是求出其中一叢最小生成森林
Kruskal’s Algorithm
生成步驟
將圖上所有邊依照權重大小由小到大排序
依序比較每條邊
- 若此邊上的兩端點已處於同棵樹,則捨棄此邊
- 若此邊上的兩端點未處於同棵樹,則利用此邊連結兩棵生成森林
Disjoint Set
關於 Disjoint Set 的基本觀念可以參考我的這篇文章:
Algorithm - Disjoint Set
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| int find(int x){ if(parent[x] < 0) return x; return parent[x] = find(parent[x]); }
void Union(int a, int b){ a = find(a); b = find(b);
if(a != b){ if(parent[a] < parent[b]){ parent[a] += parent[b]; parent[b] = a; } else{ parent[b] += parent[a]; parent[a] = b; } } }
void kruskal(){ memset(parent, -1, sizeof(parent)); sort(edge.begin(), edge.end());
int i, j; total = 0; for(i = 0, j = 0; i < N-1 && j < M; ++i){ while(find(edge[j].u) == find(edge[j].v)) ++j;
Union(edge[j].u, edge[j].v); total += edge[j].w; ++j; } }
|
Prim’s Algorithm
生成步驟
選擇任意一點作為根
屢次找不在生成樹上
離生成樹最近的點
(找與生成樹相連最短的邊)
UVA Problem
UVA 00908 - Re-connecting Computer Sites