prim算法
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
#define maxn 30
#define inf 0xfffffff
int n; //总点数
int d[maxn][maxn];//村庄图
int v[maxn];//已选标记
int l[maxn];//点到已选点最短路径长度
int prim()
{
int ans=0;//结果
memset(v,0,sizeof(v));//初始化,清零
v[0]=1;
l[0]=0;//已选(0,0)为起点
for(int i=1;i<n;i++)
{
l[i]=d[0][i];
}
for(int i=1;i<n;i++)
{
int m=inf,temp;
for(int j=0;j<n;j++)
{
if(!v[j]&&m>l[j])
{
m=l[temp=j];
}
}
ans+=m;
l[temp]=0;
v[temp]=1;
for(int i=0;i<n;i++)
{
l[i]=min(l[i],d[temp][i]);
}
}
return ans;
}
int main()
{
int p,q;
char a[2],b[2];
while(scanf("%d",&n)&&n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(i==j)
{
d[i][j]=0;
}
else
{
d[i][j]=inf;
}
}
}
for(int i=1;i<n;i++)
{
scanf("%s %d",&a,&p);
for(int j=0;j<p;j++)
{
scanf("%s %d",&b,&q);
d[a[0]-'A'][b[0]-'A']=d[b[0]-'A'][a[0]-'A']=q;
}
}
printf("%d\n",prim());
}
return 0;
}