代码
#include <iostream>
using namespace std;
#define N 27
#define M 27
#define INF 111
int dist[N];
int P[M][M]; //初始值为INF;
int n; //n个村庄;
int used[N];
int total;
void prim();
int main()
{
char v;
char tmp;
int money;
int num;
cin>>n;
while(n)
{
total=0;
for(int m=0;m<N;m++)
{
dist[m]=INF;
used[m]=0;
}
for(int j=0;j<M;j++)
for(int k=0;k<M;k++)
P[j][k]=INF;
int i=0;
for(i=0;i<n-1;i++)
{ cin>>v;
cin>>num;
while(num--){
cin>>tmp;
cin>>money;
P[v-'A'][tmp-'A']=P[tmp-'A'][v-'A']=money;
}
}
prim();
cout<<total<<endl;
cin>>n;
}
}
void prim() //从第o点开始;
{
for(int i=0;i<n;i++)
dist[i]=P[0][i];
used[0]=1;
int x;
for(x=0;x<n;x++){
int min=INF;int f=-1;
for(int i=0;i<n;i++)
if(!used[i]&&dist[i]<min)
{
min=dist[i];
f=i;
}
if(f==-1)
break;
else {
used[f]=1;
total+=dist[f];
}
for(int z=0;z<n;z++){
if(!used[z]&&P[f][z]<dist[z])
{
dist[z]=P[f][z];
}
}
}
}
很简单 很基础的最小生成树 既然ac了 就把代码贴出来了 :