Prim算法与Kruskal算法生成最小生成树

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算法实现
代码例子为本文中的图所构造

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值