题意就是要求最小生成树,用的kruskal
#include <stdio.h>
#include <algorithm>
int p[30],n,x1;
struct edge
{
int u,v,w;
}ed[100];
int get(int x)
{
if(p[x]==x)
return x;
else
return p[x]=get(p[x]);
}
void uni(int x,int y)
{
int p1,p2;
p1=get(x);
p2=get(y);
if(p1!=p2)
p[p1]=p2;
}
int cmp(const void *a,const void *b)
{
edge aa=*(const edge *)a;
edge bb=*(const edge *)b;
return aa.w-bb.w;
}
int kruskal()
{
int cost=0;
int x,y,i;
for(i=0;i<x1;i++)
{
x=ed[i].u;
y=ed[i].v;
if(get(x)!=get(y))
{
cost+=ed[i].w;
uni(x,y);
}
}
return cost;
}
int main()
{
int i,j,k;
int w1;
char u1,v1;
while(1)
{
scanf("%d",&n);
if(n==0)
break;
x1=0;
getchar();
for(i=0;i<n;i++)
p[i]=i;
for(i=1;i<=n-1;i++)
{
scanf("%c%d",&u1,&k);
getchar();
for(j=0;j<k;j++)
{
scanf("%c%d",&v1,&w1);
ed[x1].u=u1-'A';
ed[x1].v=v1-'A';
ed[x1].w=w1;
x1++;
getchar();
}
}
qsort(ed,x1,sizeof(ed[0]),cmp);
printf("%d\n",kruskal());
}
return 0;
}