题目
思路
标准的模板题,最小生成树的板子直接打进去,我用的是Prim算法。
题解
#include <iostream>
#include <cstring>
#include <stdio.h>
#include <algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
const int MAXN=110;
int cost[MAXN][MAXN];
bool vis[MAXN];
int lowc[MAXN];
//点是 0 n-1
int Prim(int cost[][MAXN],int n){
int ans=0;
memset(vis,false,sizeof(vis));
vis[0]=true;
for(int i=1;i<n;i++)lowc[i]=cost[0][i];
for(int i=1;i<n;i++){
int minc=INF;
int p=-1;
for(int j=0;j<n;j++)
if(!vis[j]&&minc>lowc[j]){
minc=lowc[j];
p=j;
}
if(minc==INF)return -1;//原图不连通
ans+=minc;
vis[p]=true;
for(int j=0;j<n;j++)
if(!vis[j]&&lowc[j]>cost[p][j])
lowc[j]=cost[p][j];
}
return ans;
}
int main()
{
int n;
while(1)
{
cin>>n;
if(n==0)
{
break;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cost[i][j]=INF;
if(i==j)
{
cost[i][j]=0;
}
}
}
for(int i=0;i<n-1;i++)
{
char dian;
int lian;
cin>>dian;
cin>>lian;
for(int j=0;j<lian;j++)
{
char lian_d;
int ju;
cin>>lian_d>>ju;
cost[dian-'A'][lian_d-'A']=ju;
cost[lian_d-'A'][dian-'A']=ju;
}
}
int ans=Prim(cost,n);
cout<<ans<<endl;
}
return 0;
}