杭电 1879 继续畅通工程

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

int set[110],n,m;

struct val

{

    int x,y,v,s;

}e[10000];

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

{

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

}

int find(int x)

{

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

}

int kruskal()

{

    int sum=0;

    int x,y,v,s;

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

    {

        x=e[i].x,y=e[i].y,v=e[i].v,s=e[i].s;

        if(s==1)

        {

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

            if(a!=b)

            {

               set[a]=b;

            }

        }

    }

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

    {

        x=e[i].x,y=e[i].y,v=e[i].v,s=e[i].s;

        if(s==0)

        {

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

            if(a!=b)

            {

                set[a]=b;

                sum+=v;

            }

        }

    }

    return sum;    

}

int main()

{

    int x,y,v,s;

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

    {

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

        {

            set[i]=i;        

        }

        m=(n*(n-1))/2;

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

        {

            scanf("%d%d%d%d",&x,&y,&v,&s);

            e[i].x=x,e[i].y=y,e[i].v=v,e[i].s=s;

        }

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

        int res=kruskal();

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

    }

   // system("pause");

    return 0;

}

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