杭电 1683 畅通工程

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

int set[110],n,m;

struct val

{

   int a,b,v;       

}e[10000];

int find(int x)

{

    return x==set[x] ? x : find(set[x]);     

}

int kruskal()

{

    int sum=0;

    for(int i=1;i<=n;i++)

    {

        int a=e[i].a,b=e[i].b,v=e[i].v;

        int x=find(a),y=find(b);

        if(x!=y)

        {

            set[x]=y;

            sum+=v;

        }

    }

    return sum;

}

int cmp(const void *a,const void *b)

{

    return ((val *)a)->v-((val *)b)->v;

}

int main()

{

    int a,b,v;

    while(scanf("%d%d",&n,&m),n)

    {

        for(int i=1;i<=m;i++)

        {

            set[i]=i;

        }

        for(int i=1;i<=n;i++)

        {

             scanf("%d%d%d",&a,&b,&v);

             e[i].a=a;

             e[i].b=b;

             e[i].v=v;

        }

        qsort(e+1,n,sizeof(e[0]),cmp);

        int f=0;

        int res=kruskal();

        for(int i=1;i<=m;i++)

        {

            if(set[i]==i)

              f++;

        }

        if(f==1)

        {

            printf("%d\n",res);

        }

        else

        {

            

           printf("?\n");

        }

    }

   // system("pause");

    return 0;

}

你可能感兴趣的:(杭电)