时间: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;}