并查集概念以及常见操作————附带完整代码

1 并查集

1.1 定义:一种维护集合的数据结构,Union(合并),Find(查找),Set(集合)。

1.2 操作:

  • 合并:合并两个集合;
  • 查找:判断两个元素是否为在一个集合

1.3 性质

  • 并查集产生的每一个集合都是一棵树

2 操作

2.1 初始化

//初始化
void Init(int father[], int n){
    for (int i = 0; i <= n; ++i)
    {
        father[i] = i;
    }
}

2.2 查找

//查找
int findFather(int x){
    while(x != father[x]){
        x = father[x];
    }
    return x;
}

int findFather2(int x){
    if(x == father[x]) return x;
    else return findFather2(father[x]);
}
  • 优化(进行路径压缩)
//路径压缩
int findFather3(int x){
    inx
    //x存放根结点,把路径上所有结点的father都改为根结点

    while(a != father[a]){
        int z = a;  //现保存a的值
        a = father[a];//a回朔父亲结点
        father[z] = x;//将原先结点a的父亲改为根结点x
    }

    return x;//返回根结点
}

int findFather4(int v){
    if(v == father[v]) return v;
    else{
        int F = findFather4(father[v]);
        father[v] = F;
        return F;
    }
}

2.3 合并

//合并
void Union(int a, int b){
    int faA = findFather(a);
    int faB = findFather(b);
    if(faA != faB){
        father[faA] = faB;
    }
}

发布了321 篇原创文章 · 获赞 51 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_33375598/article/details/104270560
今日推荐