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