杭电 1233 (并查集)

还是畅通工程

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 24069    Accepted Submission(s): 10695


Problem Description
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
 


 

Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。
 


 

Output
对每个测试用例,在1行里输出最小的公路总长度。
 


 

Sample Input
 
   
3 1 2 1 1 3 2 2 3 4 4 1 2 1 1 3 4 1 4 1 2 3 3 2 4 2 3 4 5 0
 


 

Sample Output
 
   
3 5

 

#include
#include
using namespace std;
#define MAXN 100
#define maxn MAXN*(MAXN-1)/2
int father[maxn];
int find(int x)
{
  return x==father[x]?x:father[x]=find(father[x]);
}
struct  in
{
   int start;
   int end;
   int value;
};
 

bool cmp(in a,in b)
{
  return a.value }

 int Union(int a,int b,int c)
 {
     int num=0;
    int x=find(a);
    int y=find(b);
    printf("a=%d b=%d\n",x,y);
    if(x!=y)
       {
      father[x]=y;
      num=c;
       }
       return num;
 }
 
int main()
{
    struct in s[maxn];
    int N;
    int a,b,c;
    while(scanf("%d",&N),N)
    {
       
        for(int i=1;i<=N*(N-1)/2;i++)
         father[i]=i;
        int sum=0;
      for(int i=0;i       {
      scanf("%d%d%d",&s[i].start,&s[i].end,&s[i].value);
      }
      sort(s,s+N*(N-1)/2,cmp);
     
         for(int i=0;i           {
            a=s[i].start;
            b=s[i].end;
            c=s[i].value;
          // sum+= Union(a,b,c);
          
            int x=find(a);int y=find(b);
          //  printf("a=%d b=%d\n",x,y);
            if(x!=y)  {  father[x]=y;sum+=c;}
           
          }
          printf("%d\n",sum);
         
    }
   
return 0;
}

 

你可能感兴趣的:(并查集)