http://acm.hdu.edu.cn/showproblem.php?pid=1863
#include<iostream>//又是最小生成树的问题
#include<algorithm>
#include<cstdio>
using namespace std;
int s[4951];
struct stu
{
int x;
int y;
int dis;
}df[4951];
int cmp(stu a, stu b)
{
return a.dis < b.dis;
}
int find (int a)
{
int r = a;
while(r != s[r])
r = s[r];
return r;
}
void merge(int a, int b)
{
if(a > b)
s[b] = a;
else
s[a] =b;
}
int main()
{
int n, m, q, i ,j, sum;
while(scanf("%d%d", &n, &m) != EOF)
{
if(n ==0) continue;
for(i = 0; i< n ;i++)
{
scanf("%d %d %d", &df[i].x, &df[i].y, &df[i].dis);
}
sort(df, df+n, cmp);
for(i = 1; i <= n; i++)
s[i] = i;
q =0;
sum = 0;
for(i =0; i < n; i++)
{
int a = find(df[i].x);
int b = find(df[i].y);
if(a != b)
{
sum += df[i].dis;
q++;
merge(a , b);
}
}
if(q == m-1)
printf("%d/n", sum);
else
printf("?/n");
}
}