基础算法 837.连通块中点的个数

#include<iostream>
using namespace std;
 
const int N = 100010;
int p[N], siz[N];
 
int find(int k){
    if(p[k] != k) p[k] = find(p[k]);
    return p[k];
}
 
int main(){
    int m,n;
    scanf("%d%d",&m,&n);
    for(int i = 1; i <= m; i++){
        p[i] = i;
        siz[i] = 1;
    }
    while(n --){
        char t[3];
        int a, b;
        scanf("%s",t);
        if(*t == 'C'){
            scanf("%d%d",&a, &b);
            if(find(a) == find(b)) continue;
            siz[find(b)] += siz[find(a)];
            p[find(a)] = find(b);
        }
        else if(t[1] == '1'){
            scanf("%d%d",&a, &b);
            if(a == b) 
                puts("Yes");
            else
                if(find(a) == find(b)) puts("Yes");
                else puts("No");
        }
        else{
            scanf("%d",&a);
            printf("%d\n",siz[find(a)]);
        }
    }
    return 0;
}

  

posted @ 2022-05-02 17:32  bz-2021  阅读(17)  评论(0)    收藏  举报