问题链接:Problem J
问题简述:
有n个村庄与n-1条路,维护每条路需要k元钱。现在大佬钱不够维护所有道路,让你编写一个程序求出最少维护道路要花费的钱数
问题分析:
构造出一幅每条边总权值最小的图,是最小生成树了,Kruscal大法好。
AC通过的C++语言程序如下:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<set>
#include<cstring>
#include<cmath>
#include<map>
#include<iomanip>
#define N 200005
using namespace std;
int root[30];
struct node{
int u,v,cost;
}route[505];
bool cmp(node a,node b){
return a.cost<b.cost;
}
void init(){
for(int i=0;i<=30;i++){
root[i]=i;
}
}
int find(int x){
if(root[x]==x)
return x;
else{
return root[x]=find(root[x]);
}
}
void unions(int x,int y){
int a=find(x);
int b=find(y);
if(a==b)
return;
else{
root[a]=b;
}
}
int main(){
int n;
while(cin>>n&&n){
init();
int cnt=0;
for(int i=0;i<n-1;i++){
char a;
int m;
cin>>a>>m;
for(int j=0;j<m;j++){
char b;
int cost;
int u=a-'A'+1;
cin>>b>>cost;
int v=b-'A'+1;
route[cnt].u=u;
route[cnt].v=v;
route[cnt].cost=cost;
cnt++;
}
}
sort(route,route+cnt,cmp);
int ans=0;
for(int i=0;i<cnt;i++){
if(find(route[i].u)!=find(route[i].v)){
unions(route[i].u,route[i].v);
ans+=route[i].cost;
}
}
cout<<ans<<endl;
}
}