zoukankan      html  css  js  c++  java
  • Dinic 二分图匹配 / Hopcroft-Karp 算法 复杂度简单证明

    这是一个困扰了我很久的问题,最近在算导上看到了 H-K 算法,网上提到复杂度证明的较少,故在 Wiki 上翻了一下并进行简单翻译和补充以造福社会

    垃圾百度百科竟然是 Wiki 的机翻


    Dinic 和 Hopcroft-Karp 算法的思路是每一次找到若干条最短的增广路同时增广。先给出结论:在左部点和右部点中较多的点数为 (N)、边数为 (M) 的二分图上使用 Dinic 或 Hopcroft-Karp 算法求解最大匹配的最劣时间复杂度是 (O(M sqrt{N})) 的,下面给出简单的证明。

    首先给出一个结论:

    • 在某一轮增广过程结束后,下一轮增广过程的增广路长度一定比这一轮的增广路长度长。

    Proof. 使用反证法。

    假设下一轮的增广路径不长于这一轮的增广路径。如果在下一轮的所有增广路中存在一条增广路没有退这一轮的任何增广路的流,那么因为这条增广路径要么比这一轮的增广路径短,要么一样长,所以要么这一轮的增广路不是最短的,要么这一条增广路也应该在这一轮一起增广,矛盾。

    所以只需要考虑下一轮的增广路退了这一轮增广路的流的情况。假设两条增广路分别是 (A ightarrow B ightarrow C ightarrow D)(E ightarrow C ightarrow B ightarrow F),那么可以得到 (A ightarrow B ightarrow F)(E ightarrow C ightarrow D) 这两条增广路一定存在一条比 (A ightarrow B ightarrow C ightarrow D) 短,所以 (A ightarrow B ightarrow C ightarrow D) 并不是最短增广路,矛盾。

    所以每一轮的增广长度一定是递增的。而边的流量都是 (1) 所以增广一轮的复杂度是 (O(M)) 的,故对于增广路长度 (leq sqrt{N}) 的所有路径,需要 (O(Msqrt{N})) 的时间进行增广。

    增广完了这些路径后,接下来的增广路径长度 (> sqrt{N})。设当前得到的匹配为 (P),选一个原图的最大匹配 (Q),那么 (P oplus Q)(oplus) 指对称差)会是一些路径和若干个环的并集。对于环我们可以调整 (Q) 将这个环从对称差中消去,那么可以找到一个 (Q) 使得 (P oplus Q) 中只有若干条路径。此时 (P oplus Q) 的边数是 (O(N)) 级别的,因为一个点最多与两个点在这个图上相连。同时这个图一定可以划分为边不交的若干条路径,使得每一条路径都是 (P) 匹配的增广路,沿着这些路径增广就可以得到最大匹配 (Q)

    总共只有 (N) 条边,可以划分为若干条边不交的路径,每一条路径的长度至少是 (sqrt{N}),所以至多只有 (sqrt{N}) 条路径,即 (|Q| - |P| leq sqrt{N})。每一条增广路最劣情况下需要 (O(M)) 的时间增广,所以这一部分也是 (O(M sqrt{N})) 的。

    所以加起来就是 (O(M sqrt{N})) 的。

  • 相关阅读:
    java 基本功
    orale问题汇总
    redis 集群
    centos7 之 systemctl
    redis 常见问题记录
    docker问题汇总
    sql plus 导出建表语句
    linux 添加删除用户
    mysql常用配置
    SAS 查看临时数据集
  • 原文地址:https://www.cnblogs.com/Itst/p/12556871.html
Copyright © 2011-2022 走看看