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 }