并查集-根节点的应用
思路
1. 每一个连通块中的根结点,也就是树的根结点,可以记录很多其他信息,比如这个树中的节点数量
2. 据此,在合并连通块(不同的集合),根节点可以记录节点数量多变化
3. 连通性不要求,记录具体是哪一条产生了连通,因此每次可以将根节点进行连通
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 100010;
int a[N], f[N];
int find(int x) {
if (f[x] == x) return x;
return f[x] = find(f[x]);
}
void merge(int as, int bs) {
int x = find(as), y = find(bs);
if (x == y) return ;
f[x] = y;
a[y] += a[x];
}
int query(int a, int b) {
return find(a) == find(b);
}
int count(int b) {
int x = find(b);
return a[x];
}
int main() {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) f[i] = i, a[i] = 1;
for (int i = 0; i < m; i++) {
char c[3];
int a, b;
scanf("%s", c);
if (c[0] == 'C') {
scanf("%d%d", &a, &b);
merge(a, b);
} else {
if (c[1] == '1') {
scanf("%d%d", &a, &b);
if (query(a, b)) puts("Yes");
else puts("No");
} else {
scanf("%d", &a);
cout << count(a) << endl;
}
}
}
return 0;
}