HDU 1863 畅通工程

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;

}

 

你可能感兴趣的:(HDU)