Prim算法

一个连通图的生成树是一个极小的连通子图,它包含图中全部的顶点(n个顶点),但只有n-1条边。

最小生成树:构造连通网的最小代价(最小权值)生成树。

 

P算法的核心思想是将连通图分为两部分,一部分part1是我正在构造的部分,一部分part2是用来选择顶点和边(变为part1-part2最短的边)加入到part1,最终使得part1包含全部顶点以及n-1条边。

步棸:

对于图G{V,{E}}则

1.使Vnew={u0}(u0任取一顶点),Enew={};

2.在集合E中选取权值最小的边<u,v>(u∈Vnew,v∈V-Vnew);

3.将v加入到集合Vnew,<u,v>加入集合Enew;

4.重复步棸2,直到Vnew包含连通图全部顶点;

5.输出Vnew和Enew为连通图最小生成树;

//prim算法生成最小生成树
void MiniSpanTree_prim(MGraph G)
{
	int min=0, i=0, j=0, k=0;
	int adjvex[1024] = { 0 };/*保存相关下标*/
	int lowcost[1024] = { 0 };/*保存相关顶点边间的权值*/

	lowcost[0] = 0;	/*初始化第一个权值为0,即v0加入生成树*/
					/*lowcost的值为0,在这里就是此下标的顶点已经加入生成树*/
	adjvex[0] = 0;/*初始化第一个顶点下标为0*/
	
	for (i = 1; i < G.numVertexes; i++)
	{
		lowcost[i] = G.arc[0][i];/*将v0顶点与之有关的边的权值存入数组*/
		adjvex[i] = 0;
	}

	for (i = 1; i < G.numVertexes; i++)
	{
		min = 65535;/*初始化最小权值为无穷*/

		j = 1; k = 0;
		while (j < G.numVertexes)
		{
			/*如果权值不为0且权值小于min*/
			if (lowcost[j] != 0 && lowcost[j] < min)
			{
				min = lowcost[j];
				k = j;
			}
			j++;
		}

		cout << adjvex[k] << ","<<k << " ";
		lowcost[k] = 0;/*将当前权值设置为0,表示该顶点已经完成了任务*/
		for (j = 1; j < G.numVertexes; j++)	/*循环所有顶点*/
		{
			if (lowcost[j] != 0 && G.arc[k][j] < lowcost[j])
			{
				lowcost[j] = G.arc[k][j];
				adjvex[j] = k;
			}
		}
	}

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值