zoukankan      html  css  js  c++  java
  • 图论学习四之Disjoint set union并查集

          分离集合


    在有的问题中,需要对不相交的集合(disjoint set)进行这样两种操
      作:
      • 检索某元素属于哪个集合
      • 合并两个集合
    此时,我们可以使用并查集维护这两个操作。

          并查集的森林实现


    一般来说我们用森林的结构实现并查集
    在森林中,每棵树代表一个集合。
    对每个元素,记录它在森林中的父亲f[i]
      • 对于根节点而言有f[i]=i,表示它是这个集合的代表元。


    合并操作:两个集合S1S2合并,将其中的一个树根作为另一
      个树根的子树即可。
    查找操作:对于一个元素u的查找,顺着u往上找,直到线索到
      根节点,也就确定了u所在的集合。

     

          两个优化


    启发式合并:
        在合并集合S1S2的时候,我们让较小的树成为较大的树的
      子树。这里可以是深度、节点个数等启发函数来比较树的大小。


    路径压缩:
        我们在查找完u至根节点的路径之后,一般将这条路径上的
      所有节点的父节点都设为根节点,这样可以大大减少之后的查找
      次数。

     

          并查集的时间复杂度


    可以证明,经过启发式合并和路径压缩之后的并查集,执行m
      查找的复杂度为O(mα(m))


    其中α(m)Asizekermann函数的某个反函数,你可以近似的认为
      它是小于5的。所以并查集的单次查找操作的时间复杂度也几乎
      是常数级的。

     

    EG:

    银河英雄传说(NOI2002)

    可爱的猴子(POI2003)

          带边权无向图最小连通代价


    给出一个每条边带有权值的无向图。


    我们可以删除图里面的一些边,从而使得图当中最大的边的边权
      尽量小,但是我们需要保证点1和点N仍然是连通的。

          带边权无向图最小连通代价


    对于“最小的最大”或者“最大的最小”这一类字眼,我们经常会用
      到二分答案的方法。


    对于这一题,我们可以尝试二分最大边权的最小值,然后我们只
      加入比这个值小的边,然后通过BFS(或DFS)去检查点1和点N
      不是连通的。

     

    EG:

    noip2013 货车运输


    如果你不开心,那我就把右边这个帅傻子分享给你吧,
    你看,他这么好看,跟个zz一样看着你,你还伤心吗?
    真的!这照片盯上他五秒钟就想笑了。
    一切都会过去的。
    时间时间会给你答案2333
  • 相关阅读:
    NOIP 2017逛公园(记忆化搜索)
    NOIP 2012疫情控制 (二分+倍增+贪心)
    NOIP 2005过河(DP+路径压缩)
    P1198 [JSOI2008]最大数
    [Noip2016]蚯蚓
    [六省联考2017]期末考试
    六省联考:组合数问题
    蒜头君的兔子
    bzoj1015 [JSOI2008]星球大战starwar
    luogu P3370 【模板】字符串哈希
  • 原文地址:https://www.cnblogs.com/Mary-Sue/p/9338219.html
Copyright © 2011-2022 走看看