每个集合的样子:
代码:
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
// p[i]代表i节点的父亲是谁
int p[N];
// 查询节点x的根节点
int find(int x)
{
// 如果节点x的父亲不是它本身,代表不是根节点,那么就让节点x的父亲变成根节点——>路径压缩
if (p[x] != x) p[x] = find(p[x]);
// 路径压缩后,p[x]代表根节点
return p[x];
}
int main()
{
int n, m;
cin >> n >> m;
// 将n个数1~n初始化成n个集合的根结点
// 根节点的父亲等于它本身
for (int i = 1; i <= n; i ++ ) p[i] = i;
while (m -- )
{
char op;
int a, b;
cin >> op >> a >> b;
// 合并集合: 让a节点所处集合的根节点的父亲变成b节点所处集合的根节点
if (op == 'M') p[find(a)] = find(b);
// 查询a节点和b节点在不在一个集合: 看两个节点的根节点是否相同,相同就在一个集合
else if (op == 'Q') cout << (find(a) == find(b) ? "Yes" : "No") << endl;
}
return 0;
}