首页 新闻 会员 周边 捐助

最小生成树。。

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

 

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
 
 

#include <stdio.h>  
#include <stdlib.h>    
int father[102];
struct road
{
 int u,v,len;
}path[5001];
int compare(const void*a,const void*b);
int find(int x);
void Union(int x,int y);
int main()
{
 
 int m,n,i,pv,pu,s,t=1;
 while(scanf("%d",&n)!=EOF&&n!=0)
 {
  m=(n-1)*n/2;
  for(i=1;i<=n;i++)
   father[i]=i;
  for(i=0;i<m;i++)
  {
   scanf("%d %d %d",&path[i].u,&path[i].v,&path[i].len);
  }
  
  qsort(path,m,sizeof(path[0]),compare);
  for(s=i=0;i<m;i++)
  {
   pv=find(path[i].u);
   pu=find(path[i].v);
   if(pv!=pu)
   {
    s=s+path[i].len;
    Union(pv,pu);
   
   }
  }
  printf("%d\n",s);
 }
 return 0;

}
int find(int x)
{
 if(x!=father[x])
  father[x]=find(father[x]);
 return father[x];
}
void Union(int x,int y)
{
 int a=find(x);
 int b=find(y);
 if(a!=b)
  father[b]=a;

}
int compare(const void*a,const void*b)
{

 return (*(road*)a).len-(*(road*)b).len;

一夜成魔的主页 一夜成魔 | 初学一级 | 园豆:196
提问于:2014-07-23 11:25
< >
分享
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册