并查集--九度1012 & 1109 [路径压缩]
2017-02-25 11:57
211 查看
题目【畅通工程】}:http://ac.jobdu.com/problem.php?pid=1012
思路:类似于kruskal算法对数据进行预处理,分成不同集合,集合个数减一就是答案
【1109: 只要判断最后集合个数是否为1即可】
感悟:寻找根节点时,进行了【路径压缩】,即在查找过程中,路径上所有点的父节点都重新赋值,直接指向根节点;这样有效降低搜索树的高度,提高了效率
思路:类似于kruskal算法对数据进行预处理,分成不同集合,集合个数减一就是答案
【1109: 只要判断最后集合个数是否为1即可】
感悟:寻找根节点时,进行了【路径压缩】,即在查找过程中,路径上所有点的父节点都重新赋值,直接指向根节点;这样有效降低搜索树的高度,提高了效率
#include<cstdio> #define maxSize 1005 using namespace std; int tree[maxSize];//记录城市的根节点 struct Road { //记录已有道路 int a; int b; }road[maxSize]; int findRoot(int i) {//寻找根节点 if (-1 == tree[i]) return i; else { int temp = findRoot(tree[i]); tree[i] = temp; //路径压缩 return temp; } } int main() { int n, m; while (scanf("%d", &n) != EOF) { if (0 == n) break; scanf("%d", &m); for (int j = 1; j <= n; j++) tree[j] = -1;//初始化 for (int i = 0; i < m; i++) { scanf("%d %d", &road[i].a, &road[i].b); int a = findRoot(road[i].a); int b = findRoot(road[i].b); if (b != a)//合并为同一集合 tree[a] = b; } int sum = 0; for (int i = 1; i <= n; i++) {//查询共有多少个集合 if (-1 == tree[i]) sum++; } printf("%d\n", sum - 1); //连通sum个版块,需要sum-1条路 } return 0; }
相关文章推荐
- [AOJ 2170]Marked Ancestor[并查集][离线][路径压缩]or[线段树]
- Codeforces Round #329 (Div. 2)D LCA+并查集路径压缩
- 并查集 路径压缩
- LA 6187 - Never Wait for Weights 并查集的带权路径压缩
- 并查集模板[路径压缩]
- 九度1012(并查集)
- Corporative Network UVA - 1329 加权并查集(压缩路径优化)
- 卡路径压缩的并查集题目-hdu 1856
- HDU-3635 Dragon Balls 并查集路径压缩
- Hduoj1272【并查集+路径压缩】
- [算法第一轮复习] 并查集 + 路径压缩
- 并查集 路径压缩
- C语言 并查集 压缩路径
- [HDOJ2818]Building Block(带权并查集,路径压缩)
- 并查集,battles over cities,路径压缩,优化与封装,无向图连通性
- 【模版】并查集 及路径压缩
- 并查集(递推法)+路径压缩(转)
- SDUTOJ 2797 电影节 -----非并查集解法和并查集解法(带压缩路径)
- 并查集 ---压缩路径
- POJ 1988 Cube Stacking(路径压缩并查集)