并查集

Posted dear_diary

tags:

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

 

//初始化
int father[N];
for(int i=1; i<=N; i++){
    father[i] = i; //令father[i]为1也可
}
//查找
int findFather(int x){
    //由于x在下面的while中会变成根结点,因此先把原来的x先保存下
    int a = x;
    while(x != father[x]){  //如果不是根结点,继续循环
        x = father[x]; //获得自己的父亲结点
    }
    //路径压缩(可不写)把路径上的所有结点的father都改成根结点
    while(a != father[a]){
        int z = a;
        a = father[a];
        father[z] = x;
    }
    return x;
}
//较小时间复杂度的查找(路径压缩)
int findFather(int v){
    if(v == father[v]) return v;   //找到根结点
    else{
        int F = findFather(father[v]);  //递归寻找father[v]的根结点
        father[v] = F;   //将根结点F赋给father[v]
        return F;   //返回根结点
    }
}
//合并
void Union(int a, int b){
    int faA = findFather(a); //查找a的根结点,记为faA
    int faB = findFather(b); //查找b的根结点,记为faB
    if(faA != faB){  //如果不属于同一个集合
        father[faA] = faB;   //合并
    }
}

 

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

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

树--12---并查集

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

并查集

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

并查集