九度教程74题-畅通工程

http://ac.jobdu.com/problem.php?cid=1040&pid=73

题目描述:

    省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。
输入:
    测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M (N, M < =100 );随后的 N 行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。
输出:
    对每个测试用例,在1行里输出全省畅通需要的最低成本。若统计数据不足以保证畅通,则输出“?”。

#include<stdio.h>
#include<algorithm>
using namespace std; 
int tree[101];
int findroot(int x){
    int ret;
    if(tree[x] == -1) ret = x;
    else {
         ret = findroot(tree[x]);
         tree[x] = ret;     
    }  
    return ret;
}
struct E {
       int a,b;
       int cost;       
}edge[101]; 

bool cmp(E A,E B){
     return A.cost < B.cost;     
}

int main(){
    int n,m;
    int sum[100];
    int i;
    while (scanf("%d%d",&n,&m) != EOF && n != 0){
          
          for( i = 1;i <= m;i++){
               tree[i] = -1; 
               sum[i] = 0;    
          }
          for(i = 1;i <= n;i++){
                scanf("%d%d%d",&edge[i].a,&edge[i].b,&edge[i].cost);      
          }
          sort(edge + 1,edge + n + 1,cmp);
          int a,b;
          for(i = 1;i <= n;i++){
                
                a = findroot(edge[i].a);
                b = findroot(edge[i].b);
                if(a != b) {
                     tree[a] = b;
                     sum[b] = sum[b] + sum[a] + edge[i].cost;     
                }     
          }
          int c = 0;
          int tmp;
          for( i = 1;i <= m;i++){
               if(tree[i] == -1){
                   c++; 
                   tmp = i;          
               }     
          }
          if(c == 1){
               printf("%d\n",sum[tmp]);
          }else {
               printf("?\n");      
          }
          
    }
    return 0;   
}

你可能感兴趣的:(九度教程74题-畅通工程)