Kruskal与Prim算法生成最小树

本文对比介绍了Kruskal算法和Prim算法在构建无向连通图最小生成树的应用场景,Kruskal适用于边稀疏图,Prim适合边稠密图。通过实例代码解析了如何利用vest数组实现连通分量管理和最小生成树的构建过程。
摘要由CSDN通过智能技术生成

Kruskal算法适用于边稀疏的情形

Prim算法适用于边稠密的情形

点击:Kruskal算法的理解

书上的代码:
n:图G上的顶点
e:G上的边数
vest:看是否属于同一连通分量的数组,数值相等则是。

该算法只适用于边数较少的带权无向连通图的最小生成树

typedef struct
{
	int vex1;		//边的起始顶点 
	int vex2;		//边的终止顶点 
	int weight; //边的权值 
}KEdge; 

void Kruskal(KEdge E[], int n, int e)
{
	int i, j, m1, m2, sn1, sn2, k;
	int vest[MaxVertexNum];  //用于记录数组是否属于同一集合的辅助数组 
	for(i=0; i<n; i++) //初始化数组 
		vest[i] = i;
	k = 0; //表示当前结构最小生成树的第 k条边 初始值为0 
	j = 0; //E中边的下标 初始值为0 
	for(j=0; j<e; j++)//生成的边数小于 e时继续循环 
	{
		m1 = E[j].vex1; m2 = E[j].vex2; //取得一条边的两个邻接点 
		sn1 = vest[m1]; sn2 = vest[m2]; //分别得到两个顶点所属的集合编号
		if(sn1 != sn2)  //两顶点分别属于不同的集合, 该边是最小生成树的一条边
		{
			printf("(%d, %d):%d\n", m1, m2, E[j].weight);
			k++;  							//生成的边数加 1 
			if(k == n-1) break; 
			for(i=0; i<n; i++)  //修改集合编号相同 
				if(vest[i] == sn1)
					vest[i] = sn2;
		} 
	}
}

点击:Prim算法的理解

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值