并查集

Posted Magic_chao不负青春

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并查集相关的知识,希望对你有一定的参考价值。

#include<iostream>
using namespace std;
int id[100001],si[100001];
int ifind(int p){
    while(p!=id[p]){
        id[p]=id[id[p]];//父节点为爷爷节点,路径压缩
        p=id[p];
    }
    return p;
}
void iunion(int p,int q){
    int i=ifind(p);
    int j=ifind(q);
    if(i==j) return;
    if(si[i]<si[j]){
        id[i]=j;
        si[j]+=si[i];
    }else{
        id[j]=i;
        si[i]+=si[j];
    }
}
int main(){
    int n,m,p;
    while(cin>>n>>m>>p){
        for(int i=1;i<=n;i++){
            id[i]=i;
            si[i]=1;
        }
        int ai,bi;
        for(int i=1;i<=m;i++){
            cin>>ai>>bi;
            iunion(ai,bi);
        }
        for(int i=1;i<=p;i++){
            cin>>ai>>bi;
            if(ifind(ai)==ifind(bi)) cout<<"Yes"<<endl;
            else cout<<"No"<<endl;
        }
    }
    return 0;
}

 

以上是关于并查集的主要内容,如果未能解决你的问题,请参考以下文章

想要学会并查集吗?看我四十行代码实现它

树--12---并查集

笔记并查集---无向图处理代码模板及类型题

并查集

力扣 每日一题 886. 可能的二分法难度:中等,rating: 1794(并查集 / 拆点优化的扩展域并查集)

并查集