http://ac.jobdu.com/problem.php?pid=1028

题目描述:
    省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全省畅通需要的最低成本。
输入:
    测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( 1< N < 100 );随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态,每行给4个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本,以及修建状态:1表示已建,0表示未建。

    当N为0时输入结束。
输出:
    每个测试用例的输出占一行,输出全省畅通需要的最低成本。
样例输入:
3
1 2 1 0
1 3 2 0
2 3 4 0
3
1 2 1 0
1 3 2 0
2 3 4 1
3
1 2 1 0
1 3 2 1
2 3 4 1
0
样例输出:
3
1
0

[cpp]  view plain copy
  1. #include<iostream>  
  2. #include<cstdio>  
  3. #include<cmath>  
  4. #include<algorithm>  
  5. #include<cstdlib>  
  6. #include<memory.h>  
  7. #include<cstring>  
  8.   
  9. using namespace std;  
  10. int father[101];  
  11. int getfather(int i){  
  12.     if(father[i] == i)  
  13.         return i;  
  14.     return father[i] = getfather(father[i]);  
  15. }  
  16. void merge(int a, int b){  
  17.     int fa = getfather(a);  
  18.     int fb = getfather(b);  
  19.     if(fa!=fb)  
  20.         father[fa] = fb;  
  21. }  
  22. struct Node{  
  23.     int a, b, w;  
  24.     bool operator <(const Node&node)const{  
  25.         return w < node.w;  
  26.     }  
  27. };  
  28. Node nodes[5001];  
  29. int main(){  
  30.   
  31.     //freopen("in.txt", "r", stdin);  
  32.      
  33.     int n, m;  
  34.     int a, b, w, s;  
  35.     int cnt;  
  36.     while(cin>>n, n){  
  37.         m = n*(n-1)/2;  
  38.         cnt = 0;  
  39.         for(int i=1;i<=n;++i){  
  40.             father[i] = i;  
  41.         }  
  42.         for(int i=0;i<m;++i){  
  43.             scanf("%d%d%d%d", &a, &b, &w, &s);  
  44.             if(s==0){  
  45.                 nodes[cnt].a = a;  
  46.                 nodes[cnt].b = b;  
  47.                 nodes[cnt++].w = w;  
  48.             }else{  
  49.                 merge(a, b);  
  50.             }  
  51.         }  
  52.         sort(nodes, nodes+cnt);  
  53.         int ans = 0;  
  54.         for(int i=0;i<cnt;++i){  
  55.             int fa = getfather(nodes[i].a);  
  56.             int fb = getfather(nodes[i].b);  
  57.             if(fa!=fb){  
  58.                 merge(fa, fb);  
  59.                 ans += nodes[i].w;  
  60.             }  
  61.         }  
  62.         printf("%d\n", ans);  
  63.   
  64.     }  
  65.       
  66.     //fclose(stdin);  
  67. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值