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;
    }

      

  • 相关阅读:
    反弹连接的shellcode
    md5反查网站
    一种新的Heap区溢出技术分析
    ckeditor漏洞
    Fedora Core 4下的一些小问题
    MYCCL特征码定位器详细使用之内存定位
    dedecms5.7最新注入和上传漏洞
    脱壳方法汇总
    一种小堆(heap)溢出的另类利用方法
    对付非法操作! 系统做了如下记录!
  • 原文地址:https://www.cnblogs.com/qq2210446939/p/10849449.html
Copyright © 2011-2022 走看看