码迷,mamicode.com
首页 > 其他好文 > 详细

[2016-04-09][POJ][1251][Jungle Roads]

时间:2016-04-09 01:32:07      阅读:90      评论:0      收藏:0      [点我收藏+]

标签:

  • 时间:2016-04-09 00:02:24 星期六

  • 题目编号:[2016-04-09][POJ][1251][Jungle Roads]

  • 题目大意:给定n个城镇的若干条路及其每月维修的代价,问,在所有城市联通的情况下,最少需要多少维修费

  • 分析:

    • 保证边权最小,并且图联通—–>最小生成树
  1. #include <algorithm>
  2. #include <cstring>
  3. #include <cstdio>
  4. using namespace std;
  5. int fa[30];
  6. void ini(int n){
  7. for(int i = 0 ;i <= n ; ++i)fa[i] = i;
  8. }
  9. int fnd(int x){
  10. return x == fa[x]?x:fa[x] = fnd(fa[x]);
  11. }
  12. struct Edge{
  13. int u,v,c;
  14. Edge(int _u = 0,int _v = 0,int _c = 0):u(_u),v(_v),c(_c){}
  15. bool operator < (const Edge & a)const{
  16. return c < a.c;
  17. }
  18. }e[100];
  19. int main(){
  20. int n,k,u,cnt,tmp;char ch[10];
  21. while(~scanf("%d",&n) && n){
  22. cnt = 0;
  23. for(int i = 0 ; i < n - 1 ; ++i){
  24. scanf("%s%d",ch,&tmp);u = ch[0] - ‘A‘;
  25. for(int j = 0 ;j < tmp ; ++j){
  26. scanf("%s%d",ch,&k);
  27. e[cnt++] = Edge(u,ch[0] - ‘A‘,k);
  28. }
  29. }
  30. ini(n);
  31. sort(e,e+cnt);
  32. int cur = 0,f1,f2,ans = 0;
  33. for(int i = 0 ; i < cnt;++i){
  34. f1 = fnd(e[i].u);f2 = fnd(e[i].v);
  35. if(f1 != f2){
  36. fa[f1] = f2;
  37. ans += e[i].c;
  38. ++cur;
  39. }
  40. if(cur == n - 1) break;
  41. }
  42. printf("%d\n",ans);
  43. }
  44. return 0;
  45. }




[2016-04-09][POJ][1251][Jungle Roads]

标签:

原文地址:http://www.cnblogs.com/qhy285571052/p/3f4edb70fa4986699c83ebc88c142541.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!