hdu 1233 还是畅通工程
来源:互联网 发布:印度教 基督教 知乎 编辑:程序博客网 时间:2024/05/17 04:45
Problem Description
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。
当N为0时,输入结束,该用例不被处理。
Output
对每个测试用例,在1行里输出最小的公路总长度。
Sample Input
31 2 11 3 22 3 441 2 11 3 41 4 12 3 32 4 23 4 50
Sample Output
35Huge input, scanf is recommended.HintHint
题解:
并查集的题,不是难题,开始还思考了半天,看了看别人的讲解,才知道了一个叫Kruskal的算法,具体见http://baike.baidu.com/view/247951.htm,本题先是对distance排序,然后再合并,只要两个元素在同一个集合,就抛弃,直到全部元素合并在一起。
#include <iostream>#include <cstdio>#include <cmath>#include <cstring>#include <algorithm>using namespace std;int root[10000];struct node{ int x,y,distance;} a[10000];bool cmp(node a,node b){ return a.distance<b.distance;}int look(int n){ if(n!=root[n]) root[n]=look(root[n]); return root[n];}void _union(int a,int b){ a=look(a); b=look(b); if(a!=b) root[a]=b;}int main(){ int n; while(scanf("%d",&n)!=EOF&&n) { int i,ans=0,sum=0,x,y; for(i=0; i<=n; i++) root[i]=i; for(i=0; i<n*(n-1)/2; i++) scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].distance); sort(a,a+n*(n-1)/2,cmp); for(i=0; i<n*(n-1)/2; i++) { x=look(a[i].x); y=look(a[i].y); if(x!=y) { sum+=a[i].distance; _union(x,y); ans++; } if(ans==n-1) break; } printf("%d\n",sum); } return 0;}
- hdu 1233 还是畅通工程
- HDU 1233 还是畅通工程
- hdu 1233 还是畅通工程
- HDU 1233 还是畅通工程
- hdu 1233 还是畅通工程
- hdu 1233 还是畅通工程
- HDU 1233 还是畅通工程
- hdu 1233 还是畅通工程
- HDU 1233 还是畅通工程
- hdu 1233 还是畅通工程
- hdu - 1233 - 还是畅通工程
- hdu 1233 还是畅通工程
- hdu 1233 还是畅通工程
- hdu 1233 还是畅通工程
- hdu 1233 还是畅通工程
- HDU 1233 还是畅通工程
- HDU-1233-还是畅通工程
- HDU-1233-还是畅通工程
- Android进度条简单练习实例
- hdu 4635 Strongly connected (强连通分量)
- 打印机外设通信 原理
- 前端经验
- HDU1114 Piggy-Bank
- hdu 1233 还是畅通工程
- POJ 3083 Children of the Candy Corn
- Linux下I2C驱动分析
- iOS给背景添加点击事件
- Android SDK更新以及ADT更新出现问题的解决办法
- C# Word 标题设置大纲级别和自动生成目录
- URAL1069
- 内存操作流
- 类 ArrayBlockingQueue<E>(一个由数组支持的有界阻塞队列。)