码迷,mamicode.com
首页 > 其他好文 > 详细

并查集

时间:2018-03-21 13:50:13      阅读:108      评论:0      收藏:0      [点我收藏+]

标签:i++   log   oid   turn   ret   span   pos   所有结点   int   

 

//初始化
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;   //合并
    }
}

 

并查集

标签:i++   log   oid   turn   ret   span   pos   所有结点   int   

原文地址:https://www.cnblogs.com/bahcelor/p/8616216.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!