题目链接:点击打开链接
#include <iostream>
#include<cstring>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=1e2+10;
int sum,ral[maxn][maxn];
void Prim(int start,int n)
{
int a[maxn],lowval[maxn],pos,i,j;//a[]是标记数组
a[start]=1;
sum=0;
for(i=0; i<n; i++)
{
lowval[i]=ral[start][i];
if(i!=start)a[i]=0;
}
for(i=0; i<n-1; i++)
{
int minn=INF;
for(j=0; j<n; j++)
{
if(lowval[j]<minn&&!a[j])
{
minn=lowval[j];
pos=j;
}
}
a[pos]=1;
sum+=minn;
for(j=0; j<n; j++)
{
if(ral[pos][j]<lowval[j])
lowval[j]=ral[pos][j];
}
start=pos;
}
}
int main()
{
int nodeNums;
char s1[5],s2[5];
int i,j,k,a;
while(cin>>nodeNums&&nodeNums)
{
memset(ral,0x3f,sizeof(ral));
for( i=0;i<nodeNums-1;i++)
{
cin>>s1>>j;
while(j--)
{
cin>>s2;
cin>>ral[s1[0]-'A'][s2[0]-'A'];
ral[s2[0]-'A'][s1[0]-'A']=ral[s1[0]-'A'][s2[0]-'A'];
}
}
Prim(0,nodeNums);
cout<<sum<<endl;
}
}