hdu1233---还是畅通工程 最小生成树(水)

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
struct node
{
int x,y,value;
}city[102*102];//结构体记录城市和之间的权值 
int father[102];//用于标记某个城市的根是那个城市 
int n;
int num[102];//用于记录每棵树上的节点有多少 
bool cmp(node a,node b)
{
return a.value<b.value;//升序排列 
}
void init()//初始化 
{
for(int i=1;i<=n;i++)
{
father[i]=i;num[i]=1;
}
}
int find_root(int son)//找根节点 
{
if(son!=father[son])//使用递归方法 
{
father[son]=find_root(father[son]);
}
return father[son];
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
for(int i=1;i<=n*(n-1)/2;i++)
   {
scanf("%d%d%d",&city[i].x,&city[i].y,&city[i].value);
    }
init();
sort(city+1,city+n*(n-1)/2+1,cmp);
   int fx,fy,max=0;
   for(int i=1;i<=n*(n-1)/2;i++)
   {
    fx=find_root(city[i].x);
    fy=find_root(city[i].y);
if(fx!=fy)//只要根节点不相同,说明就不是一棵树上的,那么只要把他们连在一起,并加上权值就是使用最小的费用 
{
father[fy]=fx;
max+=city[i].value;
}
   if(num[fx]==n||num[fy]==n)//小优化:如果一棵树上满足有所有的节点,说明所有的城市都连在一起,停止就可以了 
   break;
   }
     printf("%d\n",max);
}
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值