克鲁斯卡尔
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct node
{
int val;
int s;
int e;
} nn[10050];
int n, m;
int f[10050];
bool cmp(node &a,node &b)
{
return a.val<b.val;
}
void make_set()
{
for(int i = 0; i < m; i++)
{
f[i] = i;
}
}
int findd(int x)
{
if(f[x]==x)
return x;
return f[x]=findd(f[x]);
}
void unite(int x, int y)
{
int fx = findd(x);
int fy = findd(y);
if(fx == fy)
return;
else
{
f[fx]=fy;
}
}
int Kruskal(int n,int m)
{
make_set();
int nEdge=0,res=0;
sort(nn,nn+n,cmp);
for(int i = 0; i < n; i++)
{
if(nEdge==m-1)break;
if(findd(nn[i].s) != findd(nn[i].e))
{
unite(nn[i].s, nn[i].e);
res += nn[i].val;
//cout<<"bian :"<<nn[i].s<<" "<<nn[i].e<<" "<<"va"<<nn[i].val<<endl;
//cout<<res<<endl;
nEdge++;
}
}
return res;
}
int main()
{
while(scanf("%d",&m),m)
{
n=0;
int cnt=0;
for(int i=0;i<m-1;i++)
{
char c;
int a;
cin>>c>>a;
n+=a;
int u=c-'A';
for(int j=0;j<a;j++)
{
int b;
cin>>c>>b;
int v=c-'A';
nn[cnt].s=u;
nn[cnt].e=v;
nn[cnt++].val=b;
}
}
int ans = Kruskal(n, m);
printf("%d\n",ans);
}
return 0;
}