第八章——生成树和最小生成树

生成树和最小生成树

相关概念和算法思路详见这篇文章

这里只对Prim算法和Kruskal算法的代码进行介绍。


Prim算法

U为当前的连通子图所包含的顶点集合,Prim算法的本质就是每次在V-U的顶点与U的顶点的连边中选出一条加入连通子图,U同时相应地改变,直到U使得图中的所有点连通。

//v为最小生成树的起始点,closest[i]为将编号为i的结点加入到集合U中,加入到连通子图的边的另一个端点
//lowcost[i]为当前U中的顶点能够与编号为i的结点相连的边的最小花费,如果无法加入或者已经加入花费为0 
void Prim(MatGraph g,int v){
   int lowcost[MAXV],closest[MAXV],k,min;
	//将v加入到集合U中,修改与v相邻的顶点的lowcost和closest 
	for (int i=0;i<g.n;i++){
   lowcost[i]=g.edges[v][i]; closest[i]=v;}
	for (int i=1;i<g.n;i++){
   min=INF;//将剩下的n-1个顶点加入到连通子图中 
		//寻找Y-U中能够加入到U的顶点的最小花费 
		for (int j=0;j<g.n;j++) if (lowcost[j]!=0&&lowcost[j]<min){
   
			min=lowcost[j]; k=j;			
		}//打印加入的边的端点和权 
		printf(" 边(%d,%d)权为:%d\n",close
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值