连通块中点的数量
这个题很简单,只要在原来并查集模板的基础上增加一个记录点的数量的数组,根本不用把它当图做。
#include <bits/stdc++.h>
using namespace std;
int p[100005],s[100005],n,m;
int find(int x){
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
int main(){
cin >> n >> m;
for(int i = 1; i <= n; i ++) p[i] = i,s[i] = 1;
while(m --){
string t;
int a,b;
cin >> t;
if(t == "C"){
cin >> a >> b;
a = find(a),b = find(b);
if(a == b) continue;
p[a] = b;
s[b] += s[a];//将两个集合点的数量加起来
}else if(t == "Q1"){
cin >> a >> b;
a = find(a),b = find(b);
if(a == b){
cout << "Yes" << endl;
}else{
cout << "No" << endl;
}
}else{
cin >> a;
a = find(a);
cout << s[a] << endl;
}
}
return 0;
}