连通块中点的数量(并查集)
作者:
amagi
,
2023-04-03 21:07:47
,
所有人可见
,
阅读 178
#include<bits/stdc++.h>
using namespace std;
int f[100100],si[100100];
int fin(int r){
if(r != f[r]) f[r] = fin(f[r]);
return f[r];
}
int main(){
int a,b;
cin >> a >> b;
for(int i = 1; i <= a; i ++){
f[i] = i;
si[i] = 1;
}
while(b -- ){
string t;
int m,n;
cin >> t;
if(t == "C"){
cin >> m >> n;
int nm = fin(m);
int nn = fin(n);
if(nm != nn){
f[nm] = nn;
si[nn] += si[nm];
}
}
else if(t == "Q1"){
cin >> m >> n;
int nm = fin(m);
int nn = fin(n);
if(nm == nn) cout << "Yes" << endl;
else{
cout << "No" << endl;
}
}
else if(t == "Q2"){
cin >> m;
n = fin(m);
cout << si[n] << endl;
}
}
return 0;
}