码迷,mamicode.com
首页 > 其他好文 > 详细

杭电 1863 畅通工程 (最小生成树)

时间:2016-08-03 10:15:54      阅读:243      评论:0      收藏:0      [点我收藏+]

标签:

Problem Description

省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。
 

 

Input

测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M ( < 100 );随后的 N
行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。
 

 

Output

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

 

Sample Input

3 3
1 2 1
1 3 2
2 3 4
1 3
2 3 2
0 100
 

 

Sample Output

3
?
 
 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 int m,n,sun,k,i,fa[100000],sum;
 5 struct stu
 6 {
 7     int from,to,al;
 8 }st[100000];
 9 bool cmp(stu a,stu b)
10 {
11     return a.al<b.al;
12 }
13 int find(int a)
14 {
15     int r=a;
16     while(r != fa[r])
17     {
18         r=fa[r];
19     }
20     return r;
21 }
22 int main()
23 {
24     while(scanf("%d %d",&n,&m) && n)
25     {
26         sum=0;
27         for(i = 1 ; i <= m ; i++)
28         {
29             fa[i]=i;
30         }
31         for(i = 0 ; i < n ; i++)
32         {
33             scanf("%d %d %d",&st[i].from,&st[i].to,&st[i].al);
34             
35         }
36         sort(st,st+n,cmp);
37         k=0;
38         for(i = 0 ; i < n ; i++)
39         {
40             if(k == m-1) break;
41             if(find(st[i].from) != find(st[i].to))
42             {
43                 if(st[i].from  > st[i].to)
44                     fa[st[i].from]=st[i].to;
45             else
46             {
47                 fa[st[i].to]=st[i].from;
48             }
49                 sum+=st[i].al;
50                 k++;
51             }
52         }
53         if(k == m-1)
54             printf("%d\n",sum);
55         else
56             printf("?\n");
57     }
58 }

 

杭电 1863 畅通工程 (最小生成树)

标签:

原文地址:http://www.cnblogs.com/yexiaozi/p/5731631.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!