文件链接

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

本人翻译(有删改):

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

Theorem 1

\[\tag{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}\right]\]

定理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}\right] = 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)\),

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

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

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

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

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

其初始条件

\[F_0(s)=0; F_0(v)=\infty,v\neq 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)\neq \infty} \max_{0 \leq k \leq n - 1} \left[\frac{F_n(v)-F_k(v)}{n-k}\right]\qquad\]

转载于:https://www.cnblogs.com/y-clever/p/7043553.html

The Minimum Cycle Mean in a Digraph 《有向图中的最小平均权值回路》 Karp相关推荐

  1. Tree Operations 打印出有向图中的环

    题目: You are given a binary tree with unique integer values on each node. However, the child pointers ...

  2. hashmap储存有向图_java-对后边缘进行运算以获取有向图中的循环数

    我一直在编写代码,以在有向图中获得所有可能的周期. Here是一种跟踪后沿的实现,只要找到一个后沿,它就会返回true,即检测到一个循环.我将其扩展到以下内容: 计算一棵树中所有可能的后边缘,后边缘的 ...

  3. Minimum Inversion Number HDU - 1394(权值线段树/树状数组)

    The inversion number of a given number sequence a1, a2, -, an is the number of pairs (ai, aj) that s ...

  4. 一个含n个顶点和e条弧的有向图以邻接矩阵表示法为存储结构,则计算该有向图中某个顶点出度的时间复杂度为

    一个含n个顶点和e条弧的有向图以邻接矩阵表示法为存储结构,则计算该有向图中某个顶点出度的时间复杂度为(       ) A.O(n)                                   ...

  5. Python计算有向图中所有节点出度和入度

    封面图片:<Python程序设计基础(第2版)>,ISBN:9787302490562,董付国,清华大学出版社 图书详情: 配套资源:用书教师可以免费获取教学大纲.教案.课件.源码.习题答 ...

  6. 求有向图中两点最短距离java_Java 迪杰斯特拉算法实现查找最短距离

    迪杰斯特拉算法 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是 ...

  7. 计算一个有向图中出度为零和入度为零的顶点个数

    计算一个有向图中出度为零和入度为零的顶点个数 为了方便查找 有向图采用邻接矩阵实现 统计出度为0的顶点个数 即扫描邻接矩阵的某一行,记得加个tag进行标记大哥 void MGraph::Out0() ...

  8. 有向图中欧拉回路存在的充分条件及证明

    有向图中欧拉回路存在的充分条件:有向图为连通图,且每个点的入度和出度是相等的 证明:证明方法为构造性证明 过程:任意选取一点v作为起始点,遍历其能到达的点,找到一条回路(这里设该回路为R1),可以证明 ...

  9. 【机器学习系列】概率图模型第二讲:深入浅出有向图中的条件独立性和D划分

    作者:CHEONG 公众号:AI机器学习与知识图谱 研究方向:自然语言处理与知识图谱 前言: 文中含有大量公式,若需获取本文全部的手书版原稿资料,扫码关注公众号[AI机器学习与知识图谱],回复: 概率 ...

最新文章

  1. sql查询返回xml数据之应用【转载】
  2. TCP断开连接为什么是4次挥手?
  3. 【Python】青少年蓝桥杯_每日一题_5.27_画菱形
  4. 关于KVM的几篇细节文档
  5. LiveVideoStack线上交流分享 ( 五 ) —— 在线教育音视频技术探索与应用
  6. 日本原装进口雪平锅,煎炸炒煮全搞定,日本人用了 1000 年
  7. 人工智能只能用python吗_为什么人工智能用Python?
  8. 暑期训练日志----2018.8.25
  9. (转)基于openlayers实现聚类统计展示
  10. java 二分查找_Java数组之Arrays方法
  11. ip地址、域名、DNS、URL(即网址)的区别与联系
  12. jquery赋值节点
  13. 【Longest Palindromic Substring】cpp
  14. GNU Call 开源的Skype替代项目
  15. http学习笔记(四)——HTTP报文
  16. 用C/C++编程技术教你制作彩票随机程序
  17. Maven下载安装配置详细过程
  18. phpdesigner8 php7.0,让getter和setter在phpDesigner8中运行
  19. 【独立后台】2021全新最火表情包小程序源码,无限裂变,斗图小程序,头像壁纸,外卖服务内附详细搭建教程
  20. 用matplotlib可视化加州房价价格(散点图各个参数的含义)

热门文章

  1. 【Qt】监视文件和目录的修改:QFileSystemWatcher
  2. 【视频】V4L2之ioctl
  3. Ruby DSL介绍及其在测试数据构造中的使用(1)
  4. linux进程状态d状态,Linux下进程的状态
  5. php五只猴子分椰子_tubes五只雪茄_phillies雪茄五只装
  6. c语言判断数组里的数据先递增后递减,查找两个有序序数组(一个递增、一个递减)中第K大的数...
  7. php mysql execute语法_PHP PDOStatement::execute讲解
  8. 字符串声明太大出现错误_搜索框输入中文出现单引号报错问题
  9. c语言自定义char*函数返回值是乱码_[每日C语言」printf()函数的修饰符和返回值...
  10. vconsole 调试 查看LOG VUE在手机上调试 手机查看h5的日志