并查集操作

Posted morrowwind

tags:

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

#include <bits/stdc++.h>
using namespace std;
#define MAX 100
class UnionSet{
    private:
        int data[MAX+1];//即上级数组
    public:
        UnionSet(int len){
            for(int i=1;i<=len;i++) data[i]=i;
        }
        
        //将 a b 合并为一个集合里的元素,当然对应的下级也都合并了
        UnionSet merge(int a,int b){
            int aa=this->find(a);
            int bb=this->find(b);
            //如果不是同一个集合
            //当然忽略具体的上级关系,反正加入了集合
            if(aa!=bb)
                data[aa]=data[bb];
            return *this;
        }

        //找x对应的顶级上级名字,并且顺道把把经过的路径修改成顶级上级的名字,加速下次查找
        //这是路径压缩算法,目前最优的算法,时间复杂度无限接近于O1
        //递归,借助于系统的栈,需要的空间小
        int find(int x){
            return x==data[x]?x:data[x]=find(data[x]);
        }

        //非递归,这种做法不好
        // int find(int x){
        //     int k=x,*a=new int[MAX],index=0;//可以看出这种算法需要很大的空间
        //     while(k!=data[k]){
        //         a[index++]=k;
        //         k=data[k];
        //     }
        //     for(int i=0;i<index;i++)
        //         data[a[i]]=k;
        //     delete[] a;
        //     return k;
        // }

        bool connected(int x,int y){
            return find(x)==find(y);
        }

        void show(int len){
            for(int i=1;i<=len;i++) cout<<data[i]<<" ";
            cout<<endl;
        }
};
int main(){
    UnionSet us(100);
    us.show(10);
    us.merge(1,2).merge(3,4);
    us.merge(3,4);
    us.show(10);
    us.merge(1,3);
    us.show(10);
    cout<<us.connected(1,4)<<endl;
    us.show(10);
    return 0;
}

 

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

并查集

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

并查集分析与扩展

并查集

笔记并查集

并查集