题意就是要求最小生成树,用的kruskal
#include <stdio.h> #include <algorithm> int p[30],n,x1; struct edge { int u,v,w; }ed[100]; int get(int x) { if(p[x]==x) return x; else return p[x]=get(p[x]); } void uni(int x,int y) { int p1,p2; p1=get(x); p2=get(y); if(p1!=p2) p[p1]=p2; } int cmp(const void *a,const void *b) { edge aa=*(const edge *)a; edge bb=*(const edge *)b; return aa.w-bb.w; } int kruskal() { int cost=0; int x,y,i; for(i=0;i<x1;i++) { x=ed[i].u; y=ed[i].v; if(get(x)!=get(y)) { cost+=ed[i].w; uni(x,y); } } return cost; } int main() { int i,j,k; int w1; char u1,v1; while(1) { scanf("%d",&n); if(n==0) break; x1=0; getchar(); for(i=0;i<n;i++) p[i]=i; for(i=1;i<=n-1;i++) { scanf("%c%d",&u1,&k); getchar(); for(j=0;j<k;j++) { scanf("%c%d",&v1,&w1); ed[x1].u=u1-'A'; ed[x1].v=v1-'A'; ed[x1].w=w1; x1++; getchar(); } } qsort(ed,x1,sizeof(ed[0]),cmp); printf("%d ",kruskal()); } return 0; }