(http://acm.hdu.edu.cn/showproblem.php?pid=1301)
#include<iostream>
#include<cstdio>
#include<cstring>
#define INF 0xfffffff
//零基础学算法135 1<n<27 表示村庄数目
int map[28][28],f[133],n,vis[28],dis[28],min;
void prim()
{
int i,j,k,ans=0;
memset(vis,0,sizeof(vis));
for(i=1;i<=n;i++)
dis[i]=map[1][i];
vis[1]=1;//访问标志
for(i=1;i<n;i++)
{
min=INF;//无穷大
for(j=1;j<=n;j++)
if(!vis[j]&&dis[j]<min)
{
min=dis[j];
k=j;
}
vis[k]=1;
ans+=min;//ans为距离之和
for(j=1;j<=n;j++)
if(!vis[j]&&dis[j]>map[k][j])
dis[j]=map[k][j];
}
printf("%d\n",ans);
}
int main(void)
{
int i,j,m,d;
char s,c;
for(i='A';i<='Z';i++)
f[i]=i-'A'+1;
while(scanf("%d",&n),n)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
map[i][j]=INF;
getchar();
for(i=1;i<n;i++)//共有n-1行
{
scanf("%c%d",&s,&m);
getchar();
while(m--)//对每一行进行输入
{
scanf("%c%d",&c,&d);
getchar();
map[f[s]][f[c]]=map[f[c]][f[s]]=d;
}
}
prim();
}
return 0;
}