1004: 惠民工程 (2013年中南大学研究生复试机试 )

1004: 惠民工程

时间限制: 1 Sec  内存限制: 128 MB
提交: 404  解决: 81
[提交] [状态] [讨论版] [命题人:外部导入]

题目描述

市政府“惠民工程”的目标是在全市n个居民点间之架设煤气管道(但不一定有直接的管道相连,只要能间接通过管道可达即可)。很显然最多可架设 n(n-1)/2条管道,然而实际上要连通n个居民点只需架设n-1条管道就可以了。现请你编写程序,计算出该惠民工程需要的最低成本。

输入

测试输入包含若干测试用例。每个测试用例的第1行给出居民点数目M ( < =100 )、 评估的管道条数 N;随后的 N 行对应居民点间管道的成本,每行给出一对正整数,分别是两个居民点的编号,以及此两居民点间管道的成本(也是正整数)。为简单起见,居民点从1到M编号。

输出

对每个测试用例,在1行里输出全市管道畅通所需要的最低成本。若统计数据不足以保证畅通,则输出“?”。

样例输入

3 3
1 2 1
1 3 2
2 3 4
3 1
2 3 2

样例输出

3
?

来源/分类

 
 
 1 #include<iostream>
 2 #include<stdio.h> 
 3 #include<algorithm>
 4 using namespace std;
 5 /*要畅通,就必需要m-1条边,要使费用最小则尽量用权值最小的变,先对所有的边进行排序
 6 然后从小到大依次选择,判断该边是否可以加入此工程,判断的方法是使用并查集*/
 7 int n, m;
 8 int arr[105];
 9 struct node
10 {
11     int start, end, w;
12 }a[5010];
13 
14 int cmpare(node x, node y)
15 {
16     return x.w<y.w;
17 }
18 
19 int find(int x){
20     while(arr[x]!=x){
21         x=arr[x];
22     }
23     return x;
24 }
25 
26 int add(int x,int y){
27     int x1=find(x);
28     int y1=find(y);
29     if(x1!=y1){
30         arr[x1]=y1;
31         return 1;
32     }
33     return 0;
34 }
35 int main(){
36     while (scanf("%d%d", &m, &n) != EOF){
37         for (int i = 0; i < n; i++){
38             scanf("%d%d%d", &a[i].start, &a[i].end, &a[i].w);
39         }
40         sort(a, a + n, cmpare);
41         for (int i = 1; i <=m; i++){
42             arr[i] = i;
43         }
44         int num = 0;
45         int result = 0;
46         for (int i = 0; num < m - 1 && i < n; i++){
47             if (add(a[i].start,a[i].end)){
48                 num++;
49                 result += a[i].w;
50             }
51         }
52         if (num == m - 1){
53             printf("%d\n", result);
54         }
55         else{
56             printf("?\n");
57         }
58     }
59 }

 

posted @ 2019-03-18 15:52  我是happy唐啊  阅读(501)  评论(0编辑  收藏  举报