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

最小生成树。。。m,n又看反了。。。无语ing

View Code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int idx[1000000];
struct node{
    int a,b,cost;
    int st;
}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;
    while(scanf("%d",&n),n)
    {
        for(i=1;i<=n;i++)
            idx[i]=i;
        m=n*(n-1)/2;
        for(i=0;i<m;i++)
        {
            scanf("%d%d%d%d",&r[i].a,&r[i].b,&r[i].cost,&r[i].st);
            if(r[i].st)r[i].cost=0;
        }
        qsort(r,m,sizeof(r[0]),cmp);
        int cost=0;
        for(i=0;i<m;i++)
        {
               p=find(r[i].a);
            q=find(r[i].b);
            if(p!=q)
            {
                cost+=r[i].cost;
                 idx[p]=q;
              }
           }
        printf("%d\n",cost);
    }
    return 0;
}