AT_unionfind_a Union Find

题目描述

[problemUrl]: https://atcoder.jp/contests/atc001/tasks/unionfind_a 本题为讲座用题目。页面底部附有题解。 考虑一个有 $N$ 个顶点的无向图,该图不一定是简单图。初始状态下,图中只有顶点,没有任何边,所有顶点都是孤立的。接下来会给出 $Q$ 次如下两种类型的操作: - 连接操作:在顶点 $A$ 和顶点 $B$ 之间添加一条边。 - 查询操作:判断顶点 $A$ 和顶点 $B$ 是否连通。如果连通则输出 `Yes`,否则输出 `No`。 请按顺序处理所有操作,并对每个查询操作输出答案。需要注意的是,可能会多次添加同一条边,也可能会添加自环。 顶点 $A$ 和顶点 $B$ 连通,指的是可以通过若干条边从 $A$ 到达 $B$。当 $A$ 和 $B$ 是同一个顶点时,视为连通。由于图是无向图,连接操作在 $A$ 和 $B$ 之间添加边后,$A$ 可以到达 $B$,$B$ 也可以到达 $A$。

输入格式

输入通过标准输入给出,格式如下: > $N$ $Q$ > $P_1$ $A_1$ $B_1$ > $P_2$ $A_2$ $B_2$ > $\vdots$ > $P_Q$ $A_Q$ $B_Q$ - 第 $1$ 行包含两个整数 $N\ (1 \leq N \leq 100\,000)$ 和 $Q\ (1 \leq Q \leq 200\,000)$,分别表示顶点数和操作数,以空格分隔。 - 接下来的 $Q$ 行,每行包含三个整数 $P_i\ (0 \leq P_i \leq 1)$、$A_i$、$B_i\ (0 \leq A_i, B_i \leq N-1)$,以空格分隔。 - 当 $P_i = 0$ 时,表示连接操作。 - 当 $P_i = 1$ 时,表示查询操作。

输出格式

对于每个查询操作,输出一行答案。每次输出后需换行。

说明/提示

### 题解 **[并查集(Union Find,素集合数据结构)](https://www.slideshare.net/secret/CIWAduFPvzGrrE "Union find(素集合データ構造)")** 来自 **[AtCoder Inc.](http://www.slideshare.net/chokudai)** ### 样例解释 1 操作按如下顺序执行: - 第 $1$ 次操作,将顶点 $1$ 和顶点 $2$ 连接。 - 第 $2$ 次操作,将顶点 $3$ 和顶点 $2$ 连接。 - 第 $3$ 次操作,查询顶点 $1$ 和顶点 $3$ 是否连通。它们已连通,输出 `Yes`。 - 第 $4$ 次操作,查询顶点 $1$ 和顶点 $4$ 是否连通。它们未连通,输出 `No`。 - 第 $5$ 次操作,将顶点 $2$ 和顶点 $4$ 连接。 - 第 $6$ 次操作,查询顶点 $4$ 和顶点 $1$ 是否连通。它们已连通,输出 `Yes`。 - 第 $7$ 次操作,将顶点 $4$ 和顶点 $2$ 连接。它们已连通,但允许出现多重边。 - 第 $8$ 次操作,将顶点 $0$ 和顶点 $0$ 连接。它们是同一个顶点,也允许出现自环。 - 第 $9$ 次操作,查询顶点 $0$ 和顶点 $0$ 是否连通。同一个顶点总是连通的,输出 `Yes`。 由 ChatGPT 4.1 翻译