普利姆算法

普利姆算法

求最小生成树

在所有u属于U,v属于V-U的边(u,v)属于E中找一条代价最小的边(u0,v0)并入集合TE,同时v0并入U,直至U=V为止。此时TE中必有n-1条边,则T=(V,{TE})为N的最小生成树。

以下图为例,构造最小生成树,如图:
在这里插入图片描述
构造过程中辅助数组中各分量值,如图:
在这里插入图片描述
代码如下:(详解见注释)

void MiniSpanTree_PRIM(MGraph G, VertexType u) {
	struct {
		VertexType adjvex;
		VRType lowcost;//最小权值
	}closedge[MAX_VERTEX_NUM];

	k = LocalVex(G, u);//得u在G中的位置
	for (j = 0; j < G.vexnum; ++j) {
		if (j != k)
			closedge[j] = { u,G.arcs[k][j].adj };
			//把所有与u相邻接的点和权值都录入
	}
	closedge[k].lowcost = 0;//初始,U={u}。
	for (i = 1; i < G.vexnum; ++i) {
		k = minimum(closedge);
		//找权值最小的点
		printf(closedge[k].adjvex, G.vex[k]);//输出生成树的边
		closedge[k].lowcost = 0;
		for (j = 0; j < G.vexnum; ++j) {//更新最小边
			if (G.arcs[k][j].adj < closedge[k].lowcost) {
				closedge[j] = { G.vexs[k],G.arcs[k][j].adj };
			}
		}	
	}
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值