zoukankan      html  css  js  c++  java
  • The Minimum Cycle Mean in a Digraph 《有向图中的最小平均权值回路》 Karp

    文件链接

    Karp在1977年的论文,讲述了一种(O(nm))的算法,用来求有向强连通图中最小平均权值回路(具体问题请参照这里

    本人翻译(有删改):

    首先任取一个节点 (s) ,定义 (F_k(v)) 为从 (s)(v) 恰好经过 (k) 条边的最短路(不存在则为 (infty) ), (lambda^*) 表示答案,则

    Theorem 1

    [ ag{1}label{theorem}lambda^* = min_{v in V} max_{0 leq k leq n - 1} left[frac{F_n(v)-F_k(v)}{n-k} ight] ]

    定理1的证明需要一个引理。

    Lemma 2

    如果(lambda^* = 0),那么

    [min_{v in V} max_{0 leq k leq n - 1} left[frac{F_n(v)-F_k(v)}{n-k} ight] = 0 ]

    Proof. 由于 (lambda^* = 0) , 存在一个零环,但不存在负环。由于没有负环,从 (s)(v) 一定存在最短路(指取值和最小路径),且路径上边的条数不超过 (n) 。令其权值和为 (pi(v)) , 则 (F_n(v) geq pi(v)) , 且 (pi(v) = min_{0 leq k leq n - 1} F_k(v)) , 所以

    [F_n(v) - pi(v) = max_{0 leq k leq n - 1} [F_n(v) - F_k(v)] ]

    又由(F_n(v) geq pi(v))

    [ ag{2}label{lemma}max_{0 leq k leq n - 1} left[frac{F_n(v)-F_k(v)}{n-k} ight] geq 0 ]

    (( ef{lemma})) 中等号成立当且仅当 (F_n(v) = pi(v)) . 现在我们只需要证明存在这样一个节点就可以完成此引理的证明。由条件可知,图中存在零环。令此零环为 (C) ,在环上任选一点 (x) , 沿环上的边走若干步后到 (x) , 那么 (sleadsto xleadsto y) 一定是一条 (s-y) 最短路(不然的话,有某条路径(sleadsto y)权值和小于这条路径,我们就可以走(sleadsto y leadsto x),第二部分路径在环上走,容易发现这样是更短的(s-x)路径,与最短路不符)。那么,从 (x) 出发沿零环走若干步直到 (sleadsto xleadsto y) 上有(n)条边时,就有 (F_n(y) = pi(y)) , 即$$max_{0 leq k leq n - 1} left[frac{F_n(v)-F_k(v)}{n-k} ight] = 0$$. 证毕。

    Proof of Theorem 1. 我们现在讨论将图中所有边权都增加 (c) 之后定理1中的两边会怎么变化。 (lambda^*) 增加(c) , 因为所有环的平均权值都增加了 (c) . (F_k(v)) 会增加 (kc) ,

    [min_{v in V} max_{0 leq k leq n - 1} left[frac{F_n(v)-F_k(v)}{n-k} ight] ]

    也会增加 (c) . 所以定理1等号两边都增加了相同的量,仍然成立。据此,若给定任意一个图,我们将它的所有的边都同时减去某个数(c)(有可能小于0),使得存在零环而无负环,这时定理成立;我们再把每条边都加上(c),就可以得知原图中定理成立。 证毕。

    我们可以通过下述递推式求出所有 (F_k(v)) :

    [F_k(v) = min_{(u, v) in E} left[F_{k - 1}(u) + w(u, v) ight],\,k=1,2,...,n ]

    其初始条件

    [F_0(s)=0; F_0(v)=infty,v eq s ]

    由于每条边会被松弛 (O(n)) 次,最后求出 (lambda^*) 的值需要 (O(n^2)) , 总时间复杂度为 (O(nm)) .

    原论文中要求图强连通,实际上不必如此(以下原创)。

    容易发现,如果图不强连通,只有两个地方可能会出问题:第一,可能有些环从(s)无法达到,从而无法参与计算;第二,(F_n(v))有可能是正无穷(而强连通图一定不是)。

    那么,我们新建一个点(注意,实现时可能不显式写出这个点,但式子里的(n)必须要算到(n+1),或者强行把所有(F)的下标都减一也可以),从它到每个点连一条权值任意(比如都为0)的边,容易知道答案不变。以新的节点作为(s),漏洞一就被填补了。

    对于第二个漏洞:计算 (lambda^*) 时,由于我们从 (s) 向每个点连了一条边,若 (F_n(v) = infty) , 其一定不在任何一个环上(不然显然我可以在这个环上走几圈然后肯定能到这个点),直接忽略。

    所以,对于任意有向图(G),添加(s)点之后,

    [lambda^*=min_{v in V,F_n(v) eq infty} max_{0 leq k leq n - 1} left[frac{F_n(v)-F_k(v)}{n-k} ight]qquad ]

  • 相关阅读:
    【云速建站】购买前的指导
    【云速建站】域名配置指导
    Python爬虫批量下载糗事百科段子,怀念的天王盖地虎,小鸡炖蘑菇...
    舌尖上的安全
    【云速建站】视频播放专题
    Python装饰器总结,带你几步跨越此坑!
    让你提前认识软件开发(15):程序调试的利器—日志
    Win8下IIS的安装和站点的公布
    [2011山东ACM省赛] Mathman Bank(模拟题)
    Android UI开发神兵利器之Android Action Bar Style Generator
  • 原文地址:https://www.cnblogs.com/y-clever/p/7043553.html
Copyright © 2011-2022 走看看