ccf csp-201412-4-最优灌溉(Prim最小生成树)

Prim算法思路:

点我点我

1、不断地从剩下的结点找权值最小的点,加入mst
2、往mst中加入结点后,更新剩余结点的lowcost值
Prim算法数据结构选择:
1、lowcost[i]:以i为终点的边的最小权值
2、mst[i]:对应lowcost[i]的起点,即说明边<mst[i],i>是MST的一条边
lowcost[i]=mst[i]=0表示点i已加入到MST中
  • 注:如果无需打印出最小生成树,那么可以不用设立mst[]数组!
坑点:

本处参考了该博主博客

但注意,其实应该是题目给的条件有问题

它说ci>=1的

其实不然 测试数据中ci其实是有可能为0的

所以说 dist被走过了就要赋值为-1 而不是0哦哦!!!!!

代码如下

#include<iostream>
#include<climits>
using namespace std;
const int N = 1005;
int map[N][N],lowcost[N];
int n,m;
int prim(){
	int sum = 0;
	for(int i = 2; i <= n; i++){
		lowcost[i] = map[1][i];
	}
	lowcost[1]=-1;
	for(int i = 2; i <= n; i++){
		int minn = INT_MAX;int minId = 0;
		for(int j = 2; j <= n; j++){
			if(lowcost[j] < minn&&lowcost[j] != -1){
				minn = lowcost[j];
				minId = j;
			}
		}
		sum += minn;
		lowcost[minId] = -1;
		for(int j = 2; j <= n; j++){
			if(map[minId][j] < lowcost[j]){
				lowcost[j] = map[minId][j];
			}
		}
	}
	return sum;
}
int main()
{
	int a,b,c;
	scanf("%d%d", &n, &m);
	fill(map[0], map[0]+N*N, INT_MAX);
	for(int i = 0; i < m; i++){
		scanf("%d%d%d", &a, &b, &c);
		map[a][b]=map[b][a]=c;
	}
	int ans = prim();
	printf("%d", ans);
	return 0;
}
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值