Skip to content

Latest commit

 

History

History

0836

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

题目

一共有 $n$ 个数,编号是 $1 \sim n$,最开始每个数各自在一个集合中。

现在要进行 $m$ 个操作,操作共有两种:

  1. M a b,将编号为 $a$$b$ 的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作;
  2. Q a b,询问编号为 $a$$b$ 的两个数是否在同一个集合中;

输入格式

第一行输入整数 $n$$m$

接下来 $m$ 行,每行包含一个操作指令,指令为 M a bQ a b 中的一种。

输出格式

对于每个询问指令 Q a b,都要输出一个结果,如果 $a$$b$ 在同一集合内,则输出 Yes,否则输出 No

每个结果占一行。

数据范围

$1 \le n,m \le 10^5$

输入样例:

4 5
M 1 2
M 3 4
Q 1 2
Q 1 3
Q 3 4

输出样例:

Yes
No
Yes

题解

前置题目:0143

前置知识:树

本题知识:数据结构-并查集

算法前言

并查集的算法代码精巧但含有一定的思维含量

算法详情

同一集合的节点用一棵树来维护,每个节点都可以找到它的父节点

祖宗节点相同的两个节点视为属于同一个集合

祖宗节点的父节点指针仍指向自己

初始化时将所有编号 1∼n 的节点的父节点指针指向自己

合并两个集合只需要将第一个集合的祖宗节点的父节点指针指向第二个集合的祖宗节点

算法优化

并查集的算法主要包含路径压缩和按秩合并,不过一般只用到路径压缩

路径压缩指的是在寻找祖宗节点的过程中将经过的所有节点的父节点指针直接指向祖宗节点,这样在下一次查找的时候就不需要再遍历一次了

算法图示

disjoint