题目大意:给出n条道路,及维护这个道路每个月的花费,由于维护成本太高,现在要停止维护一些道路,保证所有村庄都连通,问每个月的最小花费。
注意这道题的输入,先是给出道路数目n,随后n行,每一行开头一个字母,代表村庄,然后一个数字k,代表这个村庄所连接别的村庄的道路数目,随即 k 组字母(村庄)与数字(到这个村庄的道路维护花费)。
代码实现:
#include<stdio.h>
#include<string.h>
int p[30][30],visit[30],dis[30];
int n;
void Prim(){
int k,min_c,sum=0;
memset(visit,0,sizeof(visit));
visit[1]=1;
for(int i=1;i<=n;i++)
dis[i]=p[1][i];
for(int i=1;i<n;i++){
min_c=110,k=-1;
for(int j=1;j<=n;j++){
if(visit[j]==0&&dis[j]<min_c){
min_c=dis[j];
k=j;
}
}
if(k==-1) break;
visit[k]=1;
sum+=min_c;
for(int j=1;j<=n;j++){
if(visit[j]==0&&dis[j]>p[k][j])
dis[j]=p[k][j];
}
}
printf("%d\n",sum);
}
int main(){
while(~scanf("%d",&n),n){
char f[2],t[2];
int m,val;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
p[i][j]=1e9;
}
for(int i=1;i<n;i++){
scanf("%s%d",f,&m);
for(int i=0;i<m;i++){
scanf("%s%d",t,&val);
p[f[0]-'A'+1][t[0]-'A'+1]=p[t[0]-'A'+1][f[0]-'A'+1]=val;
}
}
Prim();
}
}