您的位置:首页 > 其它

最小生成树(Minimum Spanning Tree)(Prim算法)

2016-04-05 11:21 211 查看
1. 什么是最小生成树(Minimum Spanning Tree)






2. 贪心算法:

1) 什么是“贪”:每一步都要最好的

2) 什么是“好”:权重最小的边

3) 需要约束:

     a) 只能用图里有的边

     b) 只能正好用掉|v| - 1条边

     c)  不能有回路

3. 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;
}
}
}
}
}




Prim算法和Dijkstra算法类似地方:

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完整伪码:

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(“生成树不存在”);
}
5. Prim注意点:

1) dist[V] = E(s, v)或正无穷

2) parent[s] = -1

T = O(|V|2) - 稠密图合算

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: