并查集板子:acwing836. 合并集合
文章目录
- 并查集原理
- 并查集代码实现
并查集原理
并查集的常用操作:
- 将两个集合合并
- 询问两个元素是否在同一个集合中
并查集在近乎O(1)的时间内完成以上两个操作。
基本原理:每个集合用一棵树表示。树根的编号就是整个集合的编号,每个结点存储它的父节点。用p[x]
表示x的父节点的编号。
问题1:如何判断树根? 答: if(p[x]==x),只有树根px= =x,其他结点不存在p[x]= =x
问题2:如何求x的集合编号?答: while(p[x] != x) x=p[x];
一直往上走
问题3:如何合并两个集合?答:假设px是x的集合的编号,py是y的集合编号,合并就是p[x] =py
。把一棵树挂在另一棵树上。
并查集的时间花费在问题2上,即求x的集合编号上,需要while往上找,和树的高度成正比,时间是O(logn),其实这里可以优化,对于这棵树中的结点,只需要遍历一次让每个结点找到树根,然后每个结点都指向树根结点,下次来求集合编号就是O(1)的时间复杂度。这种优化称为路径压缩。
找集合编号的代码
//返回x的祖宗节点,即集合编号
//带有路径压缩优化
int find(int x){//如果x不是根结点,就让父节点等于它的祖宗节点if(p[x] != x) p[x] =find(p[x]);return p[x];
}
并查集代码实现
以一道模板题为例:acwing836. 合并集合
ac代码
#include<bits/stdc++.h>
using namespace std;const int N =1e5+10;int p[N];//返回x的祖宗节点,即集合编号
//带有路径压缩优化
int find(int x){//如果x不是根结点,就让父节点等于它的祖宗节点if(p[x] != x) p[x] =find(p[x]);return p[x];
}int main(){int n, m;cin>> n>> m;//并查集初始 每个结点都是一个独立的集合,根结点的标志是 x == p[x]for(int i=1;i<=n;i++) p[i] =i;while(m--){string op;int a,b;cin>>op >> a >> b;//合并集合if(op =="M") p[find(a)] =find(b);else{if(find(a)==find(b))cout<<"Yes"<<endl;else cout<<"No"<<endl;}}
}
并查集板子:acwing836. 合并集合相关推荐
- BZOJ4668: 冷战 [并查集 按秩合并]
BZOJ4668: 冷战 题意: 给定 n 个点的图.动态的往图中加边,并且询问某两个点最早什 么时候联通,强制在线. 还可以这样乱搞 并查集按秩合并的好处: 深度不会超过\(O(\log n)\) ...
- BZOJ 3910 并查集+线段树合并
思路: 1. 并查集+线段树合并 记得f[LCA]==LCA的时候 f[LCA]=fa[LCA] 2.LCT(并不会写啊...) //By SiriusRen #include <cstdio& ...
- 牛客多校8 - All-Star Game(线段树分治+并查集按秩合并的撤销操作)
题目链接:点击查看 题目大意:有 n 个球员和 m 个球迷,一个球员可能是多个球迷的粉丝,需要选择最少的球员进行比赛,使得所有的球迷都愿意观看(对于每个球迷来说,都有至少一个其喜欢的球员入选比赛) 对 ...
- acm -(并查集、启发式合并、gcd、枚举因子)2020 China Collegiate Programming Contest Changchun Onsite K. Ragdoll
传送门 本题考虑直接对每个iii求出所有满足ij=gcd(i,j)i^j=gcd(i,j)ij=gcd(i,j)的jjj,然后存在ggg数组中,对于查询修改操作维护一个并查集即可,合并的时候采用启发式 ...
- 图论 + 并查集 ----最小生成树重构图 + 可撤销并查集 + set启发式合并 时间线上的离线求解 D. Graph and Queries
解题思路 题目大意: 就是给你一个无向图,每个点都有一个权值,和qqq次询问 每次询问有两种操作 1 x:就询问从x点出发,能访问到的最大权值是多少,并把最大权值那个点的权值设置为0 2 x:就是删除 ...
- NOIP2013 D1T3 货车运输 倍增LCA OR 并查集按秩合并
思路: Kruskal求最大生成树+倍增LCA // by SiriusRen #include <cstdio> #include <cstring> #include &l ...
- [ONTAK2010]Peaks【并查集+线段树合并】
文章目录 分析 代码 传送门 在Bytemountains有NNN座山峰,每座山峰有他的高度hih_ihi.有些山峰之间有双向道路相连,共MMM条路径,每条路径有一个困难值,这个值越大表示越难走,现 ...
- Codeforces Gym 101194G Pandaria (2016 ACM-ICPC EC-Final G题, 并查集 + 线段树合并)
题目链接 2016 ACM-ICPC EC-Final Problem G 题意 给定一个无向图.每个点有一种颜色. 现在给定$q$个询问,每次询问$x$和$w$,求所有能通过边权值不超过$w$的 ...
- HDU 1811 Rank of Tetris(并查集按秩合并+拓扑排序)
Rank of Tetris Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
最新文章
- PAT甲级1149 Dangerous Goods Packaging :[C++题解]哈希表、逆向思维
- Visio矢量图导出教程
- 从编码、网络传输、架构设计揭秘腾讯云高质量、高可用实时音视频技术实践...
- 关于Android手机CPU不同架构的问题
- 没有还款日期的借条会永久有效吗?
- 【Linux网络编程学习】socket API(socket、bind、listen、accept、connect)及简单应用
- 苹果汽车自动驾驶又出新信号:正与多家激光雷达供应商谈判
- pool win10提示bad_快速解决Win10出现Bad pool caller蓝屏故障的技巧
- mysql启动报错解决-1
- 系统学习机器学习之随机场(五)--CRF++源码L-BFGS算法补充
- 我去,这么简单的条件表达式竟然也有这么多坑
- 更强大的技术团队和更雄厚的预算,海外高频巨头抢占中国市场,不少本土团队淘汰出局
- python项目需求文档模板_Python+docxtpl+plotly实现模板word文档图表生成
- sql2008安装图解 sql server 2008 R2安装教程
- 密度测量:1.密度测量的基础知识
- 在线产品经理实习 任务三:给搜狐新闻24小时热点做一份产品说明文档
- ucos 入门 --- 资料收集
- 【练习】面向对象系列(002)——双色球
- 鬼吹灯文本挖掘5:sklearn实现文本聚类和文本分类
- 【深度学习】CNN与RNN有什么不同?
热门文章
- Objective-C objc_class 介绍
- [BZOJ1061][Noi2008]志愿者招募
- poj 1716 差分约束
- mysql中的自关联详解_Laravel - MySQL数据库的使用详解6(Eloquent ORM用法3:模型关联、关联查询)...
- flutter加载本地html标签,Flutter中如何加载并预览本地的html文件的方法
- 【STM32】输入捕获实验代码详解
- 径向基RBF(radial basis function)函数、RBF神经网络、 反推(back-stepping)控制
- 【数理知识】《数值分析》李庆扬老师-第8章-矩阵特征值计算
- 【Paper】2016_Cooperative UAV-UGV modeled by Petri Net Plans specification
- u-boot分析之命令实现(四)