畅通工程

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
 int i;
 int j;
 int v;
}T[5000];
int father[110],rank[110];
int N,M,t;
int cmp(node a,node b)
{
  return a.v<b.v;
}
int find(int x)
{
  return x==father[x]?x:father[x]=find(father[x]);
}
void merge(int x,int y)
{
 x=find(x),y=find(y);
 if(x!=y)
 {
 father[x]=y;
 rank[y]+=rank[x];                  //统计数据能以畅通
 if(rank[y]>t) t=rank[y];
}

}
int krusal( )
{
  int i,a,b,c,sum=0;
  for(i=0;i<N;i++)
  {
   a=T[i].i,b=T[i].j,c=T[i].v;
   if(find(a)!=find(b))
   {
     sum+=c;
     merge(a,b);
    
   }

  }
  return sum;
}   
    
int main( )
{
 while(scanf("%d%d",&N,&M),N)
 {
  t=0;
  int i,j,a,b,c;
  for(i=1;i<=M;i++)
  {
   father[i]=i;
   rank[i]=1;
  }
  for(i=0;i<N;i++)
  {
   scanf("%d%d%d",&a,&b,&c);
   T[i].i=a;
   T[i].j=b;
   T[i].v=c;
  }

  sort(T,T+N,cmp);         //克鲁斯卡尔算法,先排序,费用从小到大。。
  j=krusal();
  if(t<M)
  puts("?");
  else
  printf("%d\n",j);
}
return 0;
}

posted on 2011-04-30 10:32  more think, more gains  阅读(140)  评论(0编辑  收藏  举报

导航