并查集练习——连通块中点的数量

并查集练习——连通块中点的数量_第1张图片

 

 

#include
using namespace std;
const int N = 100010;

int n,m;
int p[N];
int cnt[N];
//带路径压缩的查找函数
int find(int x){
    if(p[x]!=x){
        p[x] = find(p[x]);
    }
    return p[x];
}
//维护了并查集大小的合并操作
int merge(int x,int y){
    //一定要先维护cnt[],再进行合并
    cnt[find(y)] += cnt[find(x)];
    p[find(x)] = find(y);
    
}




int main(){
    cin>>n>>m;
    for(int i = 0 ;i <= n ;i++){
        p[i] = i;
        cnt[i] = 1;
    } 
    string ch;
    int a,b,c;
    for(int i = 0 ;i < m ; i ++){
        cin>>ch;
        if(ch=="C"){
            cin>>a>>b;
            //要先判断这两个是否已经在同一个集合中了,再合并,否则维护的cnt数组会出错
            if(find(a) != find(b)) merge(a,b);
        }
        if(ch=="Q1"){
            cin>>a>>b;
            if(find(a) == find(b)) puts("Yes");
            else puts("No");
            
        }
        if(ch=="Q2"){
            cin>>a;
            a = find(a);
            cout<endl;
        }
        
    }
    
    
    return 0;
}

 

你可能感兴趣的:(并查集练习——连通块中点的数量)