题意:对于一些地点,它们都有路相连,这些路每年都需要维修,并且成本不同,问最小的维修费是多少。先输入一个n,再输入n-1行,每行都是先输入一个字母和一个数字a,再输入a组的一个字母和一个数字(该数字是维修费)。
思路:求道路最小维修费用,即最小生成树问题,使用kruskal算法,将道路维修费用排序,然后利用并查集,得到最小生成树。
感想:题目给出的地点是字母,将其转化为数字,然后按照kruskal算法模板求解即可。
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
#include<cmath>
using namespace std;
int parent[30];
int cnt,ans;
struct edge{
int u,v,w;
}eg[80];
bool cmp(edge a,edge b){
return a.w<b.w;
}
int find(int x){
if(parent[x]==-1)
return x;
return find(parent[x]);
}
void kruskal(){
ans=0;
memset(parent,-1,sizeof(parent));
sort(eg,eg+cnt,cmp);
for(int i=0;i<cnt;i++){
int x=find(eg[i].u);
int y=find(eg[i].v);
if(x!=y){
ans+=eg[i].w;
parent[x]=y;
}
}
}
int main(){
int n,k,d;
char c1,c2;
while(cin>>n&&n){
cnt=0;
for(int i=1;i<n;i++){
cin>>c1>>k;
while(k--){
cin>>c2>>d;
eg[cnt].u=c1-'A'+1;
eg[cnt].v=c2-'A'+1;
eg[cnt].w=d;
cnt++;
}
}
kruskal();
printf("%d\n",ans);
}
return 0;
}