并查集(模板)
作者:
Oct_9
,
2024-04-11 21:38:09
,
所有人可见
,
阅读 13
// 将两个集合合并
// 询问两个元素是否在一个集合之中
/*
每个集合用一棵树来表示。树根的编号就是整个集合的编号。
每个节点存储它的父节点,p[x] 表示x的父节点
*/
/*
1. 如何判断树根: if (x == p[x])
2. 如何获得树编号
while (p[x] != x) x = p[x]
3. 如何合并两个集合
p[x] = y; 树根的父亲等于另一棵树的树根
4. 优化(路径压缩)
一旦往上走找到了根节点,路径上的点全部直接指向根节点
*/
#include <iostream>
using namespace std;
const int N = 100010;
int p[N];
int n, m;
int find(int x) // 返回x的祖宗节点 + 路径压缩
{
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i ++) p[i] = i;
while (m --)
{
char op[2];
int a, b;
scanf("%s%d%d", op, &a, &b);
if (op[0] == 'M') p[find(a)] = find(b);
else
{
if (find(a) == find(b)) puts("Yes");
else puts("No");
}
}
return 0;
}