还是一道差不多一样的最小生成树的题目,数据量本来也不大,Kruskal 算法直接过
#include<iostream> #include<string> #include<algorithm> using namespace std; struct edge { int u,v,w; edge(int x=0,int y=0,int z=0):u(x),v(y),w(z){}; }; edge e[80]; int n,m,ans; int f[30]; int find(int x) { if(x==f[x]) return x; f[x]=find(f[x]); return f[x]; } void Union(int x,int y,int z) { int a=find(x); int b=find(y); if(a==b) return ; f[b]=a; ans+=z; } bool cmp(edge a,edge b) { return a.w<b.w; } int main() { int a,b; char c1,c2; while(cin>>n&&n) { int num=0; for(int i=1;i<=n;i++) f[i]=i; for(int i=1;i<n;i++) { cin>>c1>>a; int t=c1-'A'+1; for(int j=0;j<a;j++) { cin>>c2>>b; e[num++]=edge(t,c2-'A'+1,b); } } sort(e,e+num,cmp); ans=0; for(int i=0;i<num;i++) Union(e[i].u,e[i].v,e[i].w); cout<<ans<<endl; } return 0; }