一共有
现在要进行
-
M a b
,将编号为$a$ 和$b$ 的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作; -
Q a b
,询问编号为$a$ 和$b$ 的两个数是否在同一个集合中;
第一行输入整数
接下来 M a b
或 Q a b
中的一种。
对于每个询问指令 Q a b
,都要输出一个结果,如果 Yes
,否则输出 No
。
每个结果占一行。
4 5
M 1 2
M 3 4
Q 1 2
Q 1 3
Q 3 4
Yes
No
Yes
前置题目:0143
前置知识:树
本题知识:数据结构-并查集
并查集的算法代码精巧但含有一定的思维含量
同一集合的节点用一棵树来维护,每个节点都可以找到它的父节点
祖宗节点相同的两个节点视为属于同一个集合
祖宗节点的父节点指针仍指向自己
初始化时将所有编号 1∼n 的节点的父节点指针指向自己
合并两个集合只需要将第一个集合的祖宗节点的父节点指针指向第二个集合的祖宗节点
并查集的算法主要包含路径压缩和按秩合并,不过一般只用到路径压缩
路径压缩指的是在寻找祖宗节点的过程中将经过的所有节点的父节点指针直接指向祖宗节点,这样在下一次查找的时候就不需要再遍历一次了