并查集
解决问题:(1)将两个集合合并
(2)询问两个元素是否在一个集合中
基本原理:每个集合用一棵树来表示,树根的编号就是整个集合的编号,每个节点存储它的父节点,p[x]表示x的父节点
难点:
(1)如何判断树根:if(p[x]==x)
(2)如何求x的集合编号:while(p[x]!=x)x=p[x];
(3)如何合并两个集合:p[x]是x的集合编号,p[y]是y的集合编号,p[x]=y
优化 路径压缩(祖宗秒变爹,儿子和父亲成兄弟)
例题:合并集合
一共有 nn个数,编号是 1∼n,最开始每个数各自在一个集合中。
现在要进行 m 个操作,操作共有两种:
M a b,将编号为 a 和 b 的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作;
Q a b,询问编号为 a 和 b 的两个数是否在同一个集合中;
输入格式
第一行输入整数 n和 m。
接下来 m 行,每行包含一个操作指令,指令为 M a b 或 Q a b 中的一种。
输出格式
对于每个询问指令 Q a b,都要输出一个结果,如果 a 和 b 在同一集合内,则输出 Yes,否则输出 No。
每个结果占一行。
数据范围
1≤n,m≤1051≤n,m≤105
输入样例
4 5
M 1 2
M 3 4
Q 1 2
Q 1 3
Q 3 4
输出样例
Yes
No
Yes
代码
调用函数:返回x的祖宗节点+路径压缩
并查集
最新推荐文章于 2024-07-29 20:58:50 发布
本文深入探讨了并查集这一数据结构,主要解决集合合并与元素所属集合判断的问题。通过树形结构表示集合,利用路径压缩优化查询效率。以一个具体的例题为例,展示了如何运用并查集解决合并集合与询问元素关系的操作,并给出了相应的输入输出格式和代码实现。并查集在处理大量集合合并与查询问题时表现出高效性能。
摘要由CSDN通过智能技术生成