HDU 1233 还是畅通工程

该代码使用C++实现Prim算法来找到图的最小生成树,利用并查集处理边的连接,通过比较边的权重进行排序,最终计算出边的总权重。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int per[110];
int n,m;

struct node{
	int u,v,w;//u起点 v终点 w边 
};node edge[5000];

int cmp(node a,node b){
	return a.w < b.w; //虽然sort默认从小到大排序 但是这里是对 边排序(变量有多个不易区分) 
}//所以还需要调用cmp 
//以下三个子函数用到了并查集
void init()
{
	for(int i = 1;i <= n; i++)
		per[i] = i;
}
//并查集 节点初始化 
int find(int x)
{
	if(x==per[x])
		return x;
	return per[x]=find(per[x]);
}
//寻找根节点 
bool join(int x,int y)
{
	int fx=find(x);
	int fy=find(y);
	if(fx!=fy)
	{
		per[fx]=fy;
		return 1;
	}
	return 0;
}
// 合并 
int main()
{
	while(scanf("%d",&n),n)
	{
		m = n * (n - 1) / 2;
		for(int i = 0;i < m; i++)
			scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w);
//		sort(edge, edge+m);
		sort(edge, edge+m, cmp);
		int sum = 0;
		init();
		for(int i=0;i<m;i++)
		{
			if(join(edge[i].u,edge[i].v))//根据根节点是否相同 判断是否成环 若不成环 该边可取 否则舍去   u在生成树集合中,v在另一个集合中 
			sum+=edge[i].w;
		}
		printf("%d\n",sum);
			
	}
	
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值