用最小生成树中的Kruskal算法解决。在这里插入代码片
代码如下:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=1e3+5;
int fa[27];
struct eg
{
int f,t;
int wei;
}edge[maxn];
bool cmp(eg x,eg y)
{
return x.wei<y.wei;
}
void init()
{
for(int i=0;i<27;i++)
fa[i]=i;
}
int find(int x)
{
if(x==fa[x])
return x;
return find(fa[x]);
}
int Kruskal(int num)
{
int sum=0;
for(int i=0;i<num;i++)
{
int a=find(edge[i].f),b=find(edge[i].t);
if(a!=b)
{
fa[a]=b;
sum+=edge[i].wei;
}
}
return sum;
}
int main()
{
int n;
while(~scanf("%d",&n)&&n)
{
int cnt=0;
init();
for(int i=1;i<n;i++)
{
char c[2];int m; //一开始我是用char类型来输入的,这种方式要确定在哪里加入getchar(),所以到后面弄得很乱,索性就用数组了
scanf("%s%d",&c,&m);
for(int i=1;i<=m;i++)
{
char a[2];int b;
scanf("%s%d",&a,&b);
edge[cnt].f=c[0]-'A';
edge[cnt].t=a[0]-'A';
edge[cnt++].wei=b;
}
}
sort(edge,edge+cnt,cmp);
printf("%d\n",Kruskal(cnt));
}
return 0;
}