代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define MAXN 10000
namespace Union_Find_Set{
int fa[MAXN];
void Initialize(){
for(int i=1;i<MAXN;i++) fa[i]=i;
}
int Find(int x){
return fa[x]==x?x:fa[x]=Find(fa[x]);
}
void Union(int x,int y){
int a=Find(x),b=Find(y);
if(a!=b) fa[a]=b;
}
}
using namespace Union_Find_Set;
int n,cnt,sum=0;
char num;
struct Holder{
int u,v,w;
}e[10000];
int cmp(Holder a,Holder b){
return a.w<b.w;
}
int Kruskal(){
Initialize();
int k=0;sum=0;
sort(e+1,e+cnt,cmp);
for(int i=1;i<=cnt-1;i++){
int a=Find(e[i].u),b=Find(e[i].v);
if(a!=b){
Union(e[i].u,e[i].v);
sum+=e[i].w;
if(++k==n-1)break;
}
}
}
int main(){
while(scanf("%d\n",&n)!=EOF){
if(n==0)break;
cnt=1;
for(int i=1;i<=n-1;i++){
int k,u,v,w;
scanf("%c %d ",&num,&k);
u=num-'A'+1;
for(int j=1;j<=k;j++){
scanf("%c %d ",&num,&w);
e[cnt].u=u;e[cnt].v=num-'A'+1;e[cnt++].w=w;
}
}
Kruskal();
cout<<sum<<endl;
}
}