并查集


并查集是一种常被用来解决分组问题的算法

主要有两种操作

  • 并 (合并两个不同的集合)
  • 查 (查找元素的大哥)

每个元素都有一个大哥,对应数组num[k]的值,k是当前元素,num[k]是k的大哥

初始时每个元素的大哥都是元素本身,即num[k]=k

大哥的大哥也是你的大哥,就相当于大哥带着你投奔别人了

那么如何去找一个元素的大哥呢?代码如下

int find(int x){
    if(x==num[x])//该元素的大哥就是元素本身
        return x;
    else
        //通过前面的判断可知,x的大哥不是它本身,所以就要去寻找x的大哥,那目前x的大哥是不是num[x]
        //那万一大哥的大哥不是它本身怎么办,所以要递归去寻找大哥的大哥,并把大哥赋值给小弟
        return num[x]=find(num[x]);
    
    //最后返回大哥即可
    return num[x];
}

合并操作代码

void merge(int x,int y){
    //这里调换 x y 的位置都可以
    //找到所有 x 的所有大哥都拜 y 的大哥为大哥
    num[find(x)]=find(y);
}
最后修改:2024 年 05 月 17 日
如果觉得我的文章对你有用,请随意赞赏