AcWing 836. 合并集合
原题链接
简单
作者:
wugensheng
,
2021-04-08 14:17:32
,
所有人可见
,
阅读 247
并查集
- 将n个元素进行映射,对应n个数字(节点)
- 每个元素的初始祖先(树根节点)都是自己
- find函数找对是x节点的根节点
- 每次合并,都是将两颗树的树根节点进行合并,其中一个根节点变成另一个点儿子节点
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 100010;
int a[N], f[N];
int n, m;
int find(int x) {
if (f[x] == x) return x;
return f[x] = find(f[x]);
}
void merge(int a, int b){
int x = find(a), y = find(b);
if (x == y) return;
f[x] = y;
}
int query(int a, int b) {
return find(a) == find(b);
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) f[i] = i;
for (int i = 0; i < m; i++) {
char a;
int x, y;
cin >> a >> x >> y;
if (a == 'M') merge(x, y);
else {
if (query(x, y)) cout << "Yes" << endl;
else cout << "No" << endl;
}
}
return 0;
}