【转】C++并查集路径压缩
2016-09-28 20:24
162 查看
使用并查集查找时,如果查找次数很多,那么使用朴素版的查找方式肯定要超时。比如,有一百万个元素,每次都从第一百万个开始找,这样一次运算就是10^6,如果程序要求查找个一千万次,这样下来就是10^13,肯定要出问题的。
这是朴素查找的代码,适合数据量不大的情况:
下面是采用路径压缩的方法查找元素:
上面是一采用递归的方式压缩路径, 但是,递归压缩路径可能会造成溢出栈,我曾经因为这个RE了n次,下面我们说一下非递归方式进行的路径压缩:
这是朴素查找的代码,适合数据量不大的情况:
int findx(int x) { int r=x; while(parent[r] !=r) r=parent[r]; return r; }
下面是采用路径压缩的方法查找元素:
int find(int x) //查找x元素所在的集合,回溯时压缩路径 { if (x != parent[x]) { parent[x] = find(parent[x]); //回溯时的压缩路径 } //从x结点搜索到祖先结点所经过的结点都指向该祖先结点 return parent[x]; }
上面是一采用递归的方式压缩路径, 但是,递归压缩路径可能会造成溢出栈,我曾经因为这个RE了n次,下面我们说一下非递归方式进行的路径压缩:
int find(int x) { int k, j, r; r = x; while(r != parent[r]) //查找跟节点 r = parent[r]; //找到跟节点,用r记录下 k = x; while(k != r) //非递归路径压缩操作 { j = parent[k]; //用j暂存parent[k]的父节点 parent[k] = r; //parent[x]指向跟节点 k = j; //k移到父节点 } return r; //返回根节点的值 }
相关文章推荐
- 并查集路径压缩方法
- 并查集 带压缩路径的版本
- LA3027 并查集 压缩路径+维护距离
- 亲戚 (并查集路径压缩)
- 并查集及其路径的压缩
- Disjointset 并查集(按秩合并,与路径压缩)的模板
- 并查集路径压缩
- HDU 3038 How Many Answers Are Wrong (并查集路径压缩)
- HDU 3038 How Many Answers Are Wrong (并查集路径压缩)
- SDUTOJ 2797 电影节 -----非并查集解法和并查集解法(带压缩路径)
- [并查集+路径压缩]zoj 3261:Connections in Galaxy War
- 卡路径压缩的并查集题目-hdu 1856
- hdu 1232 借助这题学习了下并查集的路径压缩
- HDU 4496D-City2013通化邀请赛D题(并查集 需要压缩路径)
- 并查集的两种优化(按秩合并,路径压缩)
- 【并查集+压缩路径】
- HDU 1856 More is better 并查集 路径压缩
- HDU 3038 How Many Answers Are Wrong 并查集带权路径压缩
- HDU 3635 并查集+路径压缩+记录每个点移动次数
- 并查集--路径压缩