poj1251 2010.2.8
#include <stdio.h>
#include <string.h>
#define N 27+10
#define M 75+10
struct maptype {int u,v,num;};
struct maptype e[M];
int ans,n,m;
int p[N];
void init();
void qrost(int,int);
void outout();
void kruskal();
int find(int);
void init()
{
int i,j,p,val,al;
char ch,ok[10];
m=0;
for(i=1;i<n;i++)
{
scanf("%c ",&ch);
scanf("%d",&p);
for(j=1;j<=p;j++)
{
scanf(" %c",&ch);
scanf(" %d",&val);
al=ch-64;
m++;
e[m].u=i;
e[m].v=al;
e[m].num=val;
}
gets(ok);
}
}
void outout()
{
int i;
for(i=1;i<=m;i++)
printf("%d %d %d\n",e[i].u,e[i].v,e[i].num);
printf("\n");
}
void qsort(int l,int r)
{
int i,j,x;
struct maptype y;
i=l;
j=r;
x=e[(l+r)/2].num;
do
{
while (e[i].num<x) i++;
while (x<e[j].num) j--;
if (i<=j)
{
y=e[i];
e[i]=e[j];
e[j]=y;
i++;
j--;
};
}
while (i<=j);
if (l<j) qsort(l,j);
if (i<r) qsort(i,r);
}
int find(int x)
{
if (p[x]==x)
return x;
else
return (p[x]=find(p[x]));
}
void kruskal()
{
int i,x,y;
for(i=1;i<=n;i++) p[i]=i;
for(i=1;i<=m;i++)
{
x=find(e[i].u);
y=find(e[i].v);
if (x!=y)
{
ans+=e[i].num;
p[x]=y;
}
}
}
int main()
{
int i;
while (scanf("%d\n",&n),n)
{
ans=0;
init();
qsort(1,m);
kruskal();
printf("%d\n",ans);
}
return 0;
}