Prim算法与Kruskal算法构造最小生成树
Prim算法
算法思想:
1.先选择一个顶点作为树的根节点,把这个根节点当成一棵树
2.选择图中距离这棵树最近但是没有被树收录的一个顶点,把他收录在树中,并且保证不构成回路
3.按照这样的方法,把所有的图的顶点一一收录进树中。
4.如果没有顶点可以收录
a.如果图中的顶点数量等于树的顶点数量-->最小生成树构造完成
b. 如果图中的顶点数量不等于树的顶点数量-->此图不连通
Prim算法伪代码:
dist:距离当前生成树的最小距离。和根节点直接相邻的初始化为权重,其他的初始化为正无穷。等每插入一个树节点,对dist进行更新。对于已经收录的节点,更新其dist=0
//Prim算法伪代码:
//dist:距离当前生成树的最小距离。和根节点直接相邻的初始化为权重,其他的初始化为正无穷。等每插入一个树节点,对dist进行更新。对于已经收录的节点,更新其dist=0
void Prim(){
MST = {s};
while (1) {
V = 未收录顶点中dist最小者;
if ( 这样的V不存在 )
break;
将V收录进MST: dist[V] = 0;
for ( V 的每个邻接点 W )
if ( dist[W]!=W未被收录 0 )
if ( E (V,W) < dist[W] ){
dist[W] = E (V,W) ;
parent[W] = V;
}
}
if ( MST中收的顶点不到|V|个 )
Error ( “生成树不存在” );
}
Kruskal算法
算法思想:
在不构成回路的情况下,每次选取权最小的边,直到去到V-1条边为止。
//Kruskal算法伪代码
void Kruskal ( Graph G ){
MST = { } ;
while ( MST 中不到 |V|-1 条边 && E 中还有边 ) {
从 E 中取一条权重最小的边 E (v,w) ; /* 最小堆 */
将 E (v,w) 从 E 中删除;
if ( E (V,W) 不在 MST 中构成回路) /* 并查集 */
将 E (V,W) 加入 MST;
else
彻底无视 E (V,W) ;
}
}
if ( MST 中不到 |V|-1 条边 )
Error ( “生成树不存在” );
}
Prim和Kruskal的源码
Prim算法实现
Kruskal算法实现
代码例子为本文中的图所构造