HDU1232 畅通工程(并查集)
来源:互联网 发布:手机网络视频监控软件 编辑:程序博客网 时间:2024/05/22 01:58
HDU1232 畅通工程(并查集学习)
问题描述:
某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?
样例输入:
4 2
1 3
4 3
3 3
1 2
1 3
2 3
5 2
1 2
3 5
999 0
0
样例输出:
1
0
2
998
该问题实质上是已知多个连通分量,求将它们合并成一个连通分量所需要用的边数。
并查集:
由一个整型数组pre(表示该节点的直接前驱节点),Find函数(查找结点的根节点),join函数(合并两个连通分量)。其中Find函数中,采用非递归的方法压缩路径,以缩短搜索时间,思想是对于该节点所在路径上的所有前驱节点,都将其直接与根节点相连。
AC代码:
#include <cstdio>int pre[1001];int Find(int x){ int r = x; while(pre[r] != r) { r = pre[r]; } int i = x, j; //路径压缩 while(i != r) //将从根节点到x节点这条路径上所有点的前驱均置为根节点 { j = pre[i]; pre[i] = r; i = j; } return r;}void join(int x, int y){ int fx = Find(x), fy = Find(y); if(fx != fy) { pre[fy] = fx; }}int main(){ int m, n; while(~scanf("%d", &n) && n != 0) { scanf("%d", &m); for(int i = 1; i <= n; i++) { pre[i] = i; } int x, y; for(int i = 0; i < m; i++) { scanf("%d %d", &x, &y); join(x, y); } int cnt = 0; for(int i = 1; i <= n; i++) { if(pre[i] == i) { cnt++; } } printf("%d\n", cnt - 1); } return 0;}
0 0
- hdu1232 畅通工程(并查集)
- hdu1232 畅通工程(并查集)
- HDU1232 畅通工程 (并查集)
- HDU1232-畅通工程 (并查集)
- HDU1232 畅通工程(并查集)
- HDU1232:畅通工程(并查集)
- hdu1232 畅通工程(并查集)
- 【HDU1232 】畅通工程(并查集)
- hdu1232畅通工程(并查集)
- HDU1232畅通工程(并查集)
- 并查集 hdu1232 畅通工程
- 【hdu1232】畅通工程【并查集】
- HDU1232 畅通工程 并查集
- hdu1232畅通工程(并查集入门)
- 畅通工程 hdu1232 并查集
- hdu1232(畅通工程 并查集)
- 【并查集】-HDU1232-畅通工程
- HDU1232畅通工程 并查集
- matlab的memmapfile函数使用
- redis-JedisPoolConfig配置
- 排序及选择算法的java实现(一)选择、冒泡、插入、希尔、归并、快排
- PopupWindow实现类似美团下拉框
- canfestival中对象字典编辑器的打开
- HDU1232 畅通工程(并查集)
- Jedis使用总结
- 快速学习一门编程语言
- 关于Android的.so文件你所需要知道的
- MySql
- 使用AndroidStudio进行单元测试
- LeetCode 235:Lowest Common Ancestor of a Binary Search Tree
- PHP防止页面刷新与重载
- Android Studio系列教程四--Gradle基础