畅通工程
#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 阅读(152) 评论(0) 收藏 举报
浙公网安备 33010602011771号