http://acm.hdu.edu.cn/showproblem.php?pid=1301
最简单的最小生成树
View Code
#include <stdio.h> #include <stdlib.h> int p[30]; int cnt,n; typedef struct L { int a,b,d; }L; L r[1000]; int cmp(const void*a,const void*b){return (*(struct L*)a).d-(*(struct L*)b).d;} int find(int x){return p[x]==x?x:p[x]=find(p[x]);} int Kruskal() { int i,ans=0; int x,y; for(i=0;i<n;i++)p[i]=i; qsort(r,cnt,sizeof(L),cmp); for(i=0;i<cnt;i++) { x=find(r[i].a); y=find(r[i].b); if(x!=y){ans+=r[i].d;p[x]=y;} } return ans; } int main() { int m,i,j; int dis; char rt,lf; while(scanf("%d%*c",&n),n) { cnt=0; for(i=0;i<n-1;i++) { scanf("%c%d%*c",&rt,&m); for(j=0;j<m;j++) { scanf("%c%d%*c",&lf,&dis); r[cnt].a=rt-'A'; r[cnt].b=lf-'A'; r[cnt++].d=dis; } } printf("%d\n",Kruskal()); } return 0; }