并查集

借鉴博客传送门:https://blog.csdn.net/qq_41593380/article/details/81146850

简述:

  并查集就是一种拥有特殊标记方式的集合,每个数据集合用一个数据作为代表,这样不同数据直接就可以通过一些操作查询是否属于相同集合,还能合并不同数据集。并查集的本质就是在一个标记数组中操作,我们定义pre[i]为第i个数据或数据为i的上级,当pre[i]=i的时候也就是上级是自己的时候,那个数据以及他所以的下级就代表了一个集合。

操作:

  并查集顾名思义可以做到查找和合并的操作。

  查找那就是一直找pre直到找到pre[i]=i,我们可以通过很简单的递归实现。

int find(int x){//查找x的标志 
    if(pre[x]==x) return x;
    else return find(pre[x]);
}

  我们可以发现,有用的只有pre[i]=i的标志位,它的下级和下级的下级本质上都是一样的,为了方便之后的查询,我们可以实现路径压缩。

   也就是在查的时候整理一下所属关系,实现右边的情况。

int find(int x){
    return pre[x]==x?x:pre[x]=find(pre[x]);
}

  合并的操作更为简单,若有两个数据x和y,他们的标志位分别为fx和fy,若他们属于不同数据集,若想合并这两个数据集,pre[fx]=fy或pre[fy]=fx就可以实现这个操作了,可以理解为把整棵树连到另一颗数下面。

void merge(int x,int y){
    int fx=find(x),fy=find(y);
    if(fx!=fy) pre[fx]=fy;
}

  

原文地址:https://www.cnblogs.com/qq2210446939/p/10849449.html