zoukankan      html  css  js  c++  java
  • 并查集

    借鉴博客传送门: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;
    }

      

  • 相关阅读:
    《3S新闻周刊》No.8:导航迈入井喷时代
    ESRI的Blog正式开始更新
    Google Earth中国部分数据重大更新
    说说EverNote
    选择ESRI的理由
    使用XAML和SharpMap渲染一幅地图
    《Excel与VBA程序设计》最新消息,预计9月上市
    基于Flash的全球卫星照片在线服务
    javascript运算符重载的实现
    uml各类图
  • 原文地址:https://www.cnblogs.com/qq2210446939/p/10849449.html
Copyright © 2011-2022 走看看