查找根
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
int Tree[50];
int findRoot(int x){
if(Tree[x]==-1)return x;
else{
int tmp = findRoot(Tree[x]);
Tree[x] = tmp;
return tmp;
}
}
struct Edge{
int a,b;
int weight;
}edge[800];
bool cmp(Edge a,Edge b){
return a.weight<b.weight;
}
int main(){
int n;
char m1,m2;
int k,num;//k为该点后面有几条路
while(scanf("%d",&n)!=EOF&&n!=0){
int size = 0;//边数
for(int i = 1;i<n;i++)
{
scanf(" %c %d",&m1,&k);
for(int j = 1;j<=k;j++)
{
scanf(" %c %d",&m2,&num);
edge[size].a=m1-'A'+1;//点的编号
edge[size].b=m2-'A'+1;
edge[size].weight=num;
size++;
}
}
sort(edge,edge+size,cmp);
for(int i = 1;i<50;i++)
Tree[i]=-1;
int res = 0;
for(int i = 0;i<size;++i)
{
int a = findRoot(edge[i].a);
int b = findRoot(edge[i].b);
if(a!=b)
{
Tree[a]=b;
res+=edge[i].weight;
}
}
printf("%d\n",res);
}
return 0;
}