这一题目,主要是如何建图。
也是用模板。不多说。
#include<iostream>
#include<cstring>
using namespace std;
#define maxn 1000 + 10
#define INF 100000000
int net[maxn][maxn],lowcost[maxn],vis[maxn];
int n;
int prim()
{
int j,k,mins,yes;
int sum=0;
memset(vis,0,sizeof(vis));
vis[1]=1;
for(;;)
{
mins=INF;
yes=-1;
for(j=1;j<=n;j++)
{
if(lowcost[j] < mins && !vis[j])
{
mins=lowcost[j];
yes=1;
k=j;
}
}
if(yes==-1) break;
vis[k]=1;
sum+=mins;
for(j=1;j<=n;j++)
if(lowcost[j]>net[k][j] && !vis[j]) lowcost[j]=net[k][j];
}
return sum;
}
int main()
{
int i,j;
char first,next;
int num,costs;
while(cin>>n && n)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) net[i][j]=INF,net[j][i]=INF;
for(i=1;i<n;i++)
{
cin>>first>>num;
for(j=0;j<num;j++)
{
cin>>next>>costs;
net[first-'A'+1][next-'A'+1] = costs;
net[next-'A'+1][first-'A'+1] = costs;
}
}
for(i=1;i<=n;i++) lowcost[i]=net[1][i];
cout<<prim()<<endl;
}
return 0;
}