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

来源:互联网 发布:长春java培训哪家好 编辑:程序博客网 时间:2024/04/30 01:44
#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;
}
0 0