hdu1863-最小生成樹(kruskal)
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
struct node
{
int from;
int to;
int val;
}a[1000005];
int fa[1000005];
int findroot(int x)
{
if(fa[x] == x)
return x;
else
return fa[x] = findroot(fa[x]);
}
void merge(int x , int y)
{
int fax = findroot(x);
int fay = findroot(y);
fa[fay] = fax;
}
bool cmp (node a , node b)
{
return a.val < b.val;
}
int n , m;
int main(void)
{
while(scanf("%d %d",&n, &m) != EOF)
{
if(n == 0)
return 0;
for(int i = 1 ; i <= n ; i ++)
cin>>a[i].from>>a[i].to>>a[i].val;
sort(a+1,a+1+n,cmp);
for(int i = 1 ; i <= m ; i++)
fa[i] = i;
int ans = 0;
for(int i = 1 ; i <= n ; i ++)
{
if(findroot(a[i].from) != findroot(a[i].to))
{
ans += a[i].val;
merge(a[i].from,a[i].to);
}
}
int flag = 0;
for(int i = 1 ; i <= m ; i ++)
findroot(i);
for(int i = 1 ; i <= m ; i ++)
if(fa[i] == i)
flag ++;
if(flag == 1)
cout<<ans<<endl;
else
cout<<"?"<<endl;
}
}