求最小代价生成树——Prim算法

基本思想:
设G=(V,E)是具有n个顶点的连通网,
T=(U,TE)是G的最小生成树,
T的初始状态为U={u0}(u0属于V),TE={},
重复执行下述操作:
在所有u属于U,v属于V-U的边中找一条代价最小的边(u,v)并入集合TE,同时v并入U,直至U=V;
1.
在这里插入图片描述
2.
在这里插入图片描述
3.
在这里插入图片描述
4.
在这里插入图片描述
5.
在这里插入图片描述
6.
在这里插入图片描述
代码实现:
数组lowcost[n]:用来保存集合V-U中各顶点与集合U中顶点最短边的权值,lowcost[v]=0来表示顶点v已经加入最小生成树中;
数组adjvex[n]:用来保存该边所依附的(集合V-U中各顶点与集合U中顶点最短边)集合U中的顶点。
lowcost[i]=w
表示顶点vi和顶点vk之间的权值为w,其中vi属于V-U且vk属于U
adjvex[i]=k
伪代码实现
1.初始化两个辅助数组lowcost(=arc[0][i])和adjvex(=0)(0是起始点)
2.输出顶点u0,将顶点u0加入集合U中;
3.重复执行下列操作n-1次
3.1在lowcost中选取最短边lowcost[k],取对应的顶点序号k;
3.2输出顶点k和对应的权值;
3.3将顶点k加入集合U中(lowcost[k]=0)
3.4调整数组lowcost和adjvex;

void prime(MGraph G)//上篇博客写了图的实现
	{
	fort(int i=1;i<G.vertexNum;++i)
		{
				lowcost[i]=G.arc[0][j];adjvex[i]=0;
		}
		lowcost[0]=0;
		for(int i=1;i<G.vertexNum;++i)
		{
				k=MinEdge(lowcost,G.vertexNum)
				cout<<k<<adjvex[k]<<lowcost[k];
				lowcost[k]=0;
				for(int j=1,j<G.vertexNum;++j)
				if(G.arc[k][j]<lowcost[j]){
				lowcost[j]=G.arc[k][j];
				arcvex[j]=k;
				}
		}
	}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值