最小生成樹(Minimum Spanning Tree)(Prim演算法)
阿新 • • 發佈:2019-02-16
1. 什麼是最小生成樹(Minimum Spanning Tree)
2. 貪心演算法:
1) 什麼是“貪”:每一步都要最好的
2) 什麼是“好”:權重最小的邊
3) 需要約束:
a) 只能用圖裡有的邊
b) 只能正好用掉|v| - 1條邊
c) 不能有迴路
3. Prim演算法(讓一棵小樹長大):
Dijkstra和Prim演算法和類似,如下:
Dijkstra演算法:
Prim演算法和Dijkstra演算法類似地方:Void Dijkstra(Vertex s) { while(1) { V = 未收錄頂點中dist最小者; if( 這樣的V不存在 ) break; collected[V] = true; for(V的每個鄰接點 W ) { if(collected[W] == false) { if(dist[V] +E<v, w> < dist[W]) { dist[W] = dist[V] + E<v,w>; path[W] = V; } } } } }
void Prim()
{
MST = {s};
while(1)
{
V = 未收錄頂點中dist最小者;
if( 這樣的V不存在 )
break;
將V收錄進MST:
for( V的每個鄰接點W )
{
if( W未被收錄 )
{
dist[W] = E(v, w);
parent[W] = V;
}
}
}
}
Prime完整偽碼:
5. Prim注意點:void Prim() { MST ={S}; while(1) { V = 未收錄頂點中dist最小者; if(這樣的V不存在) break; 將V收錄進MST:dist[V] = 0 for( V的每個鄰接點W ) { if( dist[W] != 0 ) { if(E(v,w) < dist[W]) { dist[W] = E(v,w); parent[W] = V; } } } } if(MST中收到的頂點不到|V|個) Error(“生成樹不存在”); }
1) dist[V] = E(s, v)或正無窮
2) parent[s] = -1
T = O(|V|2) - 稠密圖合算