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; }