九度教程75-继续畅通工程

题目描述:
    省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全省畅通需要的最低成本。
输入:
    测试输入包含若干测试用例。每个测试用例的第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
#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;
       int flag;       
}edge[5000]; 


bool cmp(E A,E B){
     if(A.flag != B.flag) {
         return A.flag > B.flag;      
     }else {
           return A.cost < B.cost;
     }     
}


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

 
 
 

 

 
  
  
  
  

你可能感兴趣的:(九度教程75-继续畅通工程)