http://acm.hdu.edu.cn/showproblem.php?pid=1863

裸的最小生成树,只需多判断一下是否连通,我用的方法是看是否只有一个根节点。

ps:m和n写反了,害我查了1h啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

View Code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int idx[1000000];
struct node{
    int a,b,cost;
}r[1000000];
int cmp(const void*a,const void*b)
{
    return (*(struct node*)a).cost-(*(struct node*)b).cost;
}
int find(int n)
{
    return idx[n]==n?n:idx[n]=find(idx[n]);
}
int main()
{
    int i,n,m;
    int p,q;
    int f;
    while(scanf("%d",&n),n)
    {
        scanf("%d",&m);
        for(i=1;i<=m;i++)
            idx[i]=i;
        for(i=0;i<n;i++)
            scanf("%d%d%d",&r[i].a,&r[i].b,&r[i].cost);
        qsort(r,n,sizeof(struct node),cmp);
        int cost=0;
        for(i=0;i<n;i++)
        {
            p=find(r[i].a);
            q=find(r[i].b);
            if(p!=q)
            {
                cost+=r[i].cost;
                idx[p]=q;
            }
        }
        f=0;
        for(i=1;i<=m;i++)
            if(find(i)==i)
                f++;
        if(f>1)
            printf("?\n");
        else
            printf("%d\n",cost);
    }
    return 0;
}