很简单的求最小代价生成树的问题,利用Prim很容易求出
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=200; //最大费用是不多于100,所以定义一个比100 大的数即可
int n,sum,weight[30][30];
int lowcost[30];
bool visit[30];
void Prim(int v)
{
int i,j,k,min;
visit[v]=true;
for(i=1;i<=n;i++)
{
if(i!=v)
lowcost[i]=weight[1][i];
else
lowcost[i]=maxn;
}
for(i=1;i<n;i++)
{
min=maxn;
for(j=1;j<=n;j++) //最小生成树有n-1条边
if(lowcost[j]<min && !visit[j])
{
min=lowcost[j];
k=j;
}
visit[k]=true;
sum+=min;
for(j=1;j<=n;j++)
if(weight[k][j]<lowcost[j] && !visit[j])
lowcost[j]=weight[k][j];
}
}
int main()
{
int i,j,k,w,temp;
char ch;
while(scanf("%d",&n) && n)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
weight[i][j]=maxn;
for(i=0;i<n-1;i++)
{
scanf(" %c",&ch);
temp=ch-'A'+1;
scanf(" %d",&k);
for(j=0;j<k;j++)
{
scanf(" %c",&ch);
scanf(" %d",&w);
weight[temp][ch-'A'+1]=w;
weight[ch-'A'+1][temp]=w;
}
}
memset(visit,0,sizeof(visit));
sum=0;
Prim(1);
printf("%d\n",sum);
}
return 0;
}