浙大2007年研究生机试
畅通工程
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
int fa[110];
struct Cost{
int s;
int e;
int cost;
bool operator < (const Cost &A) const {
return cost < A.cost;
}
};
int Getfa(int x){
if (x == fa[x])
return x;
fa[x] = Getfa(fa[x]);
return fa[x];
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("E:\\in.txt", "r", stdin);
#endif
int n, m; //n 道路数,m村庄数
while(scanf("%d %d", &n, &m) && n){
Cost buf[110];
int i;
for(i=1; i<=m; i++){
fa[i] = i;
}
for(i=0; i<n; i++){
scanf("%d %d %d", &buf[i].s, &buf[i].e, &buf[i].cost);
}
sort(buf, buf+n);
int ans=0;
for(i=0; i<n; i++){
if(Getfa(buf[i].s) != Getfa(buf[i].e)){
fa[Getfa(buf[i].s)] = Getfa(buf[i].e);
ans += buf[i].cost;
}
}
int j, flag=1;
for(i=1; i<=m; i++){
for(j=i+1; j<=m; j++){
if(Getfa(i) != Getfa(j)){
flag = 0;
break;
}
}
}
if(flag == 0)//资料不足
printf("?\n");
else
printf("%d\n", ans);
}//while
return 0;
}