prim算法

主要思想:
以顶点为主线,构成生成树。把图的顶点分成两类,一类是生成树中的点(类A),另一类是图余下的点(类B)。从与类A中的点相邻接的,属于类B的点中,选择权值最小的边,把它加入到生成树中,直到图中所有顶点被加入类A。

int Prim(Graph g)
{
	int sum = 0, v;
	int vset[Max];
	info lowcost[Max];//保存最小生成树的顶点是谁拉进来的
	int i;
	//init
	for(i = 0 ; i < Max ; i++)
	{
		vset[i] = 0;
	}
 
	for(i = 1 ; i <= g->n ; i++)
	{
		lowcost[i].data = g->table[1][i];
		lowcost[i].from = 1;
	}
 
	vset[1] = 1;
 
	//main
	for(i = 1 ; i <= g->n-1 ; i++)
	{
		int k , min = Max , p = 0;
		//find min weight & position
		for(k = 1 ; k <= g->n ; k++)
		{
			if(lowcost[k].data < min && vset[k] == 0)
			{
				min = lowcost[k].data;
				p = k;
			}
		}
		//add
		sum += min;
		//update lowcost array
		v = p;
		for(k = 1 ; k <= g->n ; k++)
		{
			if(vset[k] == 0 && g->table[v][k] < lowcost[k].data)
			{
				lowcost[k].data = g->table[v][k];
				lowcost[k].from = v;
			}
		}
		vset[v] = 1;
	}
	return sum;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值