HDU - 1233 还是畅通工程

Posted luhongkai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU - 1233 还是畅通工程相关的知识,希望对你有一定的参考价值。

某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。 

Input测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。 
当N为0时,输入结束,该用例不被处理。 
Output对每个测试用例,在1行里输出最小的公路总长度。 
Sample Input

3
1 2 1
1 3 2
2 3 4
4
1 2 1
1 3 4
1 4 1
2 3 3
2 4 2
3 4 5
0

Sample Output

3
5


        
 
Huge input, scanf is recommended.

Hint

Hint
话说题上说的“Huge input, scanf is recommended.”这句话我做完才发现,但是用C++的输入输出流完全过。这道题非常像“畅通工程 ”这道题。
附上地址:https://www.cnblogs.com/luhongkai/p/9571330.html
是我的另一个博客,希望有意者看一看,对你理解最小生成树有帮助,两个非常相似的题
技术分享图片
 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4 const int maxn = 1e3;
 5 int p[maxn];
 6 int n,m;
 7 struct face
 8 {
 9     int u,v,w;
10 } edge[maxn*maxn];
11 bool cmp(face a,face b)
12 {
13     return a.w<b.w;
14 }
15 void init()
16 {
17     for(int i=1; i<=n; i++)
18         p[i]=i;
19 }
20 int find(int x)
21 {
22     return x==p[x]?x:p[x] = find(p[x]);
23 }
24 int kruskal()
25 {
26     int ans=0;
27     init();
28     sort(edge,edge+m,cmp);
29     for(int i=0; i<m; i++)
30     {
31         int x = find(edge[i].u);
32         int y = find(edge[i].v);
33         if(x!=y)
34         {
35             ans+=edge[i].w;
36             p[x] = y;
37         }
38     }
39     return ans;
40 }
41 int main()
42 {
43     while(cin>>n&&n!=0)
44     {
45         m=n*(n-1)/2;
46         for(int i=0; i<m; i++)
47             cin>>edge[i].u>>edge[i].v>>edge[i].w;
48         cout<<kruskal()<<endl;
49     }
50 }
View Code

 







以上是关于HDU - 1233 还是畅通工程的主要内容,如果未能解决你的问题,请参考以下文章

还是畅通工程[HDU1233]

HDU 1233: 还是畅通工程

hdu 1233 还是畅通工程 (prim)

HDU 1233 还是畅通工程

还是畅通工程 HDU - 1233

HDU1233 还是畅通工程