原题链接:
题解:
这个是在基础并查集上+了一个维护每个集合中点的数量的数组
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int p[N], S[N];//只对树的祖先结点的S数组进行维护,存储的是该树中的结点数量
int find(int x) {
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
int main() {
int n, m;cin >> n >> m;
//初始化
for (int i = 1;i <= n;i++) {
p[i] = i;
S[i] = 1;
}
while (m--) {
string op;cin >> op;
int a, b;
if (op == "C") {
cin >> a >> b;
if (find(a) != find(b))
S[find(b)] += S[find(a)];
p[find(a)] = find(b);
}
else if (op == "Q1") {
cin >> a >> b;
cout << ((find(a) == find(b)) ? "Yes" : "No") << endl;
}
else {
cin >> a;
cout << S[find(a)] << endl;
}
}
}