文章目录

  • 并查集原理
  • 并查集代码实现

并查集原理

并查集的常用操作:

  1. 将两个集合合并
  2. 询问两个元素是否在同一个集合中

并查集在近乎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. 合并集合相关推荐

  1. BZOJ4668: 冷战 [并查集 按秩合并]

    BZOJ4668: 冷战 题意: 给定 n 个点的图.动态的往图中加边,并且询问某两个点最早什 么时候联通,强制在线. 还可以这样乱搞 并查集按秩合并的好处: 深度不会超过\(O(\log n)\) ...

  2. BZOJ 3910 并查集+线段树合并

    思路: 1. 并查集+线段树合并 记得f[LCA]==LCA的时候 f[LCA]=fa[LCA] 2.LCT(并不会写啊...) //By SiriusRen #include <cstdio& ...

  3. 牛客多校8 - All-Star Game(线段树分治+并查集按秩合并的撤销操作)

    题目链接:点击查看 题目大意:有 n 个球员和 m 个球迷,一个球员可能是多个球迷的粉丝,需要选择最少的球员进行比赛,使得所有的球迷都愿意观看(对于每个球迷来说,都有至少一个其喜欢的球员入选比赛) 对 ...

  4. 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数组中,对于查询修改操作维护一个并查集即可,合并的时候采用启发式 ...

  5. 图论 + 并查集 ----最小生成树重构图 + 可撤销并查集 + set启发式合并 时间线上的离线求解 D. Graph and Queries

    解题思路 题目大意: 就是给你一个无向图,每个点都有一个权值,和qqq次询问 每次询问有两种操作 1 x:就询问从x点出发,能访问到的最大权值是多少,并把最大权值那个点的权值设置为0 2 x:就是删除 ...

  6. NOIP2013 D1T3 货车运输 倍增LCA OR 并查集按秩合并

    思路: Kruskal求最大生成树+倍增LCA // by SiriusRen #include <cstdio> #include <cstring> #include &l ...

  7. [ONTAK2010]Peaks【并查集+线段树合并】

    文章目录 分析 代码 传送门 在Bytemountains有NNN座山峰,每座山峰有他的高度hih_ihi​.有些山峰之间有双向道路相连,共MMM条路径,每条路径有一个困难值,这个值越大表示越难走,现 ...

  8. Codeforces Gym 101194G Pandaria (2016 ACM-ICPC EC-Final G题, 并查集 + 线段树合并)

    题目链接  2016 ACM-ICPC EC-Final Problem G 题意  给定一个无向图.每个点有一种颜色. 现在给定$q$个询问,每次询问$x$和$w$,求所有能通过边权值不超过$w$的 ...

  9. HDU 1811 Rank of Tetris(并查集按秩合并+拓扑排序)

    Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

最新文章

  1. PAT甲级1149 Dangerous Goods Packaging :[C++题解]哈希表、逆向思维
  2. Visio矢量图导出教程
  3. 从编码、网络传输、架构设计揭秘腾讯云高质量、高可用实时音视频技术实践...
  4. 关于Android手机CPU不同架构的问题
  5. 没有还款日期的借条会永久有效吗?
  6. 【Linux网络编程学习】socket API(socket、bind、listen、accept、connect)及简单应用
  7. 苹果汽车自动驾驶又出新信号:正与多家激光雷达供应商谈判
  8. pool win10提示bad_快速解决Win10出现Bad pool caller蓝屏故障的技巧
  9. mysql启动报错解决-1
  10. 系统学习机器学习之随机场(五)--CRF++源码L-BFGS算法补充
  11. 我去,这么简单的条件表达式竟然也有这么多坑
  12. 更强大的技术团队和更雄厚的预算,海外高频巨头抢占中国市场,不少本土团队淘汰出局
  13. python项目需求文档模板_Python+docxtpl+plotly实现模板word文档图表生成
  14. sql2008安装图解 sql server 2008 R2安装教程
  15. 密度测量:1.密度测量的基础知识
  16. 在线产品经理实习 任务三:给搜狐新闻24小时热点做一份产品说明文档
  17. ucos 入门 --- 资料收集
  18. 【练习】面向对象系列(002)——双色球
  19. 鬼吹灯文本挖掘5:sklearn实现文本聚类和文本分类
  20. 【深度学习】CNN与RNN有什么不同?

热门文章

  1. Objective-C objc_class 介绍
  2. [BZOJ1061][Noi2008]志愿者招募
  3. poj 1716 差分约束
  4. mysql中的自关联详解_Laravel - MySQL数据库的使用详解6(Eloquent ORM用法3:模型关联、关联查询)...
  5. flutter加载本地html标签,Flutter中如何加载并预览本地的html文件的方法
  6. 【STM32】输入捕获实验代码详解
  7. 径向基RBF(radial basis function)函数、RBF神经网络、 反推(back-stepping)控制
  8. 【数理知识】《数值分析》李庆扬老师-第8章-矩阵特征值计算
  9. 【Paper】2016_Cooperative UAV-UGV modeled by Petri Net Plans specification
  10. u-boot分析之命令实现(四)