1. 程式人生 > >hdu1863-最小生成樹(kruskal)

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;

    }
}