并查集路径压缩优化 UnionFind PathCompression(C++)
/*
* UnionFind.h
* 有两种实现方式,QuickFind和QuickUnion
* QuickFind:
* 查找O(1)
* 合并O(n)
* QuickUnion:(建议使用)
* 查找O(logn)可优化至O(a(n)),a(n)<5
* 合并O(logn)可优化至O(a(n)),a(n)<5
* Created on: 2020年2月13日
* Author: LuYonglei
*/ //由于QuickFind平均时间复杂度不理想,所以本文件只用QuickUnion来实现
//本文件基于rank实现优化
//在原有基础上实现路径压缩
#ifndef SRC_UNIONFIND_H_
#define SRC_UNIONFIND_H_
#include <assert.h>
#include <stack>
#define DEFAULT_CAPACITY 10
using namespace std; class UnionFind {
public:
UnionFind(int capacity) :
capacity_(capacity > ? capacity : DEFAULT_CAPACITY), parents(
new int[capacity > ? capacity : DEFAULT_CAPACITY]), ranks(
new int[capacity > ? capacity : DEFAULT_CAPACITY]) {
//初始化构造函数
for (int i = ; i < capacity_; i++) {
parents[i] = i;
ranks[i] = ; //以i为根节点的树的高度
}
} ~UnionFind() {
//析构函数
delete[] parents;
delete[] ranks;
} #if 0
//递归实现路径压缩
int findParent(int value) {
assert(value < capacity_ && value >= );
if (parents[value] != value) {
parents[value] = findParent(parents[value]);
}
return parents[value];
}
#elif 0
//迭代实现路径压缩1
int findParent(int value) {
assert(value < capacity_ && value >= );
stack<int> s;
while (value != parents[value]) {
s.push(value);
value = parents[value];
}
int preIndex = ;
while (s.size() != ) {
preIndex = s.top();
parents[preIndex] = value;
s.pop();
}
return value;
} #else
//迭代实现路径压缩2
int findParent(int value) {
assert(value < capacity_ && value >= );
int begin = value;
while (value != parents[value]) {
value = parents[value];
}
int tmpBegin = ;
while (begin != value) {
tmpBegin = parents[begin];
parents[begin] = value;
begin = tmpBegin;
}
return value;
} #endif void unionValue(int leftValue, int rightValue) {
//统一实现左边跟随右边
int leftParent = findParent(leftValue);
int rightParent = findParent(rightValue);
if (leftParent == rightParent)
return;
if (ranks[leftParent] < ranks[rightParent]) {
parents[leftParent] = rightParent;
} else if (ranks[rightParent] > ranks[leftParent]) {
parents[rightParent] = leftParent;
} else {
parents[leftParent] = rightParent;
ranks[rightParent] += ;
}
} bool isSame(int leftValue, int rightValue) {
return findParent(leftValue) == findParent(rightValue);
} private:
int capacity_;
int *parents;
int *ranks;
}; #endif /* SRC_UNIONFIND_H_ */
并查集路径压缩优化 UnionFind PathCompression(C++)的更多相关文章
- 并查集路径分裂优化 UnionFind PathSpliting(C++)
/* * UnionFind.h * 有两种实现方式,QuickFind和QuickUnion * QuickFind: * 查找O(1) * 合并O(n) * QuickUnion:(建议使用) * ...
- 并查集路径减半优化 UnionFind PathHalving (C++)
/* * UnionFind.h * 有两种实现方式,QuickFind和QuickUnion * QuickFind: * 查找O(1) * 合并O(n) * QuickUnion:(建议使用) * ...
- 【数轴涂色+并查集路径压缩+加速】C. String Reconstruction
http://codeforces.com/contest/828/problem/C [题意] [思路] 因为题目保证一定有解,所有优化时间复杂度的关键就是不要重复染色,所以我们可以用并查集维护区间 ...
- 并查集+路径压缩(poj1988)
http://poj.org/problem?id=1988 Cube Stacking Time Limit: 2000MS Memory Limit: 30000K Total Submiss ...
- hdu 1558 线段相交+并查集路径压缩
Segment set Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 并查集 + 路径压缩(经典) UVALive 3027 Corporative Network
Corporative Network Problem's Link Mean: 有n个结点,一开始所有结点都是相互独立的,有两种操作: I u v:把v设为u的父节点,edge(u,v)的距离为ab ...
- - > 并查集+路径压缩(详解)(第一节)
先举一个友爱的例子解释一下并查集: 话说江湖上散落着各式各样的大侠,有上千个之多. 他们没有什么正当职业,整天背着剑在外面走来走去,碰到和自己不是一路人的,就免不了要打一架.但大侠们有一个优点就是讲义 ...
- HDOJ 3635 并查集- 路径压缩,带秩合并
思路来源:http://blog.csdn.net/niushuai666/article/details/6990421 题目大意: 初始时,有n个龙珠,编号从1到n,分别对应的放在编号从1到n的城 ...
- LA 并查集路径压缩
题目大意:有n个节点,初始时每个节点的父亲节点都不存在.有两种操作 I u v:把点节点u的父亲节点设为v,距离为|u-v|除以1000的余数.输入保证执行指令前u没有父亲节点. E u:询问u到根节 ...
随机推荐
- fatal: HttpRequestException encountered
报错:fatal: HttpRequestException encountered 解决方法 Github 禁用了TLS v1.0 and v1.1,必须更新Windows的git凭证管理器,才行. ...
- elementui_day02
Elementui_day02 1. maven多模块搭建 1.1 搭建多模块的好处 1. 方便维护(代码增加,拆分越细,越好维护) 2. 有些公共的内容(BaseDomain.BaseService ...
- 重写了下Ajax请求Webservice,顺便复习一下Javascript的闭包概念
var AjaxRequest = function(){ //返回处理结果的回调函数 this.agentCallBack = {}; //javascript 调用domino代理的方法. thi ...
- python文件操作汇总day7
Python处理文件 文件操作分为读.写.修改,我们先从读开始学习 读文件 示例1: f = open(file='D:/工作日常/兼职白领学生空姐模特护士联系方式.txt',mode='r',enc ...
- Bash脚本编程学习笔记04:测试命令test、状态返回值、位置参数和特殊变量
我自己接触Linux主要是大学学习的Turbolinux --> 根据<鸟哥的Linux私房菜:基础篇>(第三版) --> 马哥的就业班课程.给我的感觉是这些课程对于bash的 ...
- 【pycharm基本操作】项目创建、切换、运行、字体颜色设置,常见包的安装步骤
创建新项目 退出项目 怎样区别虚拟环境和系统环境? 虚拟环境和系统环境切换:进入项目切换解释器 切换项目 创建python目录和文件 代码运行方式一: 还可以这样执行代码方式二: 文件的剪切.复制.删 ...
- 图片上传的进度条-jquery
<div style="padding: 10px;"> <div class="progress-bar" style="disp ...
- (转)jvm具体gc算法介绍标记整理--标记清除算法
转自:https://www.cnblogs.com/ityouknow/p/5614961.html GC算法 垃圾收集器 概述 垃圾收集 Garbage Collection 通常被称为“GC”, ...
- Java求素数和
描述 从键盘任意输入两个整数m,n,编程计算并输出m~n之间的所有素数之和. 输入 在一行上输出m和n. 输出 m和n之间(包括m和n)的素数的和 难度 一般 输入示例 2 5 输出示例 10 完成代 ...
- P3759 [TJOI2017]不勤劳的图书管理员 [树套树]
树套树是什么啊我不知道/dk 我只知道卡常数w // by Isaunoya #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC o ...