维护连通块内结点数量的并查集

https://www.acwing.com/problem/content/839/

#include<iostream>
using namespace std;

const int N=100010;
int n,m;
int p[N],cnt[N];

int find(int x){
    if(p[x]!=x) p[x]=find(p[x]);
    return p[x];
}

int main(){
    cin>>n>>m;
    string op;
    int a,b;
    for(int i=1;i<=n;i++){
        p[i]=i;
        cnt[i]=1;
    }
    while(m--){
        cin>>op;
        
        if(op=="C"){
            cin>>a>>b;
            a=find(a);
            b=find(b);
            if(a!=b){
                p[a]=b;
                cnt[b]+=cnt[a];
            }
        }else if(op=="Q1"){
            cin>>a>>b;
            if(find(a)==find(b)) cout<<"Yes";
            else cout<<"No";
            puts("");
        }else{
            cin>>a;
            cout<<cnt[find(a)]<<endl;
        }
    }
    return 0;
    
}
posted @ 2022-01-17 20:37  秋月桐  阅读(27)  评论(0编辑  收藏  举报