其实还是裸的最小生成树 只是题意麻烦了点

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; struct road { int f,t; int w; }; road num[1000]; int fa[1000]; char ts[20]; int n,coun; int find(int x) { return fa[x]==x?x:find(fa[x]); } int cmp(road a,road b) { return a.w<b.w; } int kruskal() { int i,j,ans=0; sort(num,num+coun,cmp); for(i=0;i<100;i++) fa[i]=i; //coun的个数有可能小于节点数 for(i=0;i<coun;i++) { int x=find(num[i].f); int y=find(num[i].t); if(x!=y) { fa[x]=y; ans+=num[i].w; } } return ans; } int main() { int tn,i,j,was; char from[10],to[10]; while(scanf("%d",&n)!=EOF) { if(n==0) break; coun=0; for(i=0;i<n-1;i++) { scanf("%s%d",from,&tn); while(tn--) { scanf("%s%d",to,&was); num[coun].f=from[0]-'A'; num[coun].t=to[0]-'A'; num[coun].w=was; coun++; } } printf("%d ",kruskal()); } return 0; }