-
时间:2016-04-09 00:02:24 星期六
-
题目编号:[2016-04-09][POJ][1251][Jungle Roads]
-
题目大意:给定n个城镇的若干条路及其每月维修的代价,问,在所有城市联通的情况下,最少需要多少维修费
-
分析:
- 保证边权最小,并且图联通—–>最小生成树
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
int fa[30];
void ini(int n){
for(int i = 0 ;i <= n ; ++i)fa[i] = i;
}
int fnd(int x){
return x == fa[x]?x:fa[x] = fnd(fa[x]);
}
struct Edge{
int u,v,c;
Edge(int _u = 0,int _v = 0,int _c = 0):u(_u),v(_v),c(_c){}
bool operator < (const Edge & a)const{
return c < a.c;
}
}e[100];
int main(){
int n,k,u,cnt,tmp;char ch[10];
while(~scanf("%d",&n) && n){
cnt = 0;
for(int i = 0 ; i < n - 1 ; ++i){
scanf("%s%d",ch,&tmp);u = ch[0] - ‘A‘;
for(int j = 0 ;j < tmp ; ++j){
scanf("%s%d",ch,&k);
e[cnt++] = Edge(u,ch[0] - ‘A‘,k);
}
}
ini(n);
sort(e,e+cnt);
int cur = 0,f1,f2,ans = 0;
for(int i = 0 ; i < cnt;++i){
f1 = fnd(e[i].u);f2 = fnd(e[i].v);
if(f1 != f2){
fa[f1] = f2;
ans += e[i].c;
++cur;
}
if(cur == n - 1) break;
}
printf("%d\n",ans);
}
return 0;
}
时间: 2024-10-12 19:27:35