AcWing 837. 连通块中点的数量
原题链接
简单
作者:
minux
,
2020-04-23 22:25:24
,
所有人可见
,
阅读 457
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n, m;
int FA[N];
int SC[N];
int Find(int x){
if(x!=FA[x]) FA[x]=Find(FA[x]);
return FA[x];
}
void Union(int x, int y){
int fx = Find(x);
int fy = Find(y);
if(fx != fy){
FA[fx]=fy;
SC[fy]+=SC[fx]; // 合并连通分量
}
}
int main(){
cin.tie(0);
ios::sync_with_stdio(false);
memset(FA, 0x00, sizeof FA);
memset(SC, 0x00, sizeof SC);
cin>>n>>m;
for(int i=1; i<=n; ++i){
FA[i]=i;
SC[i]=1;
}
string P;
int x, y;
while(m--){
cin>>P;
if(P=="C"){
cin>>x>>y;
Union(x, y);
}
else if(P=="Q1"){
cin>>x>>y;
if(Find(x)==Find(y)) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
else if(P=="Q2"){
cin>>x;
cout<<SC[Find(x)]<<endl;
}
}
return 0;
}