837. 连通块中点的数量
题目链接https://www.acwing.com/problem/content/description/839/
题目:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1e5+10;
int p[N],cnt[N];
int findd(int u){
if(p[u]!=u) p[u]=findd(p[u]);
return p[u];
}
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<N;i++){
p[i]=i;
cnt[i]=1;
}
char op[3];
int a,b,x,y;
while(m--){
scanf("%s",op);
//cout<<op<<endl;
if(!strcmp(op,"C")){
scanf("%d%d",&a,&b);
x=findd(a),y=findd(b);
if(x!=y){//这里是判断a,b是否在同一颗树下
p[x]=y;
cnt[y]+=cnt[x];
}
}else if(!strcmp(op,"Q1")){
scanf("%d%d",&a,&b);
x=findd(a),y=findd(b);
if(x==y) printf("Yes\n");
else printf("No\n");
}else{
scanf("%d",&a);
x=findd(a);
printf("%d\n",cnt[x]);
}
}
return 0;
}