文件链接

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\]

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

  1. UVA 11090 Going in Cycle!! 环平均权值(bellman-ford,spfa,二分)

    题意: 给定一个n个点m条边的带权有向图,求平均权值最小的回路的平均权值? 思路: 首先,图中得有环的存在才有解,其次再解决这个最小平均权值为多少.一般这种就是二分猜平均权值了,因为环在哪也难以找出来 ...

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

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

  3. hdu3342-判断有向图中是否存在(至少)3元环或回路-拓扑排序

    一:题目大意:   给你一个关系图,判断是否合法,    每个人都有师父和徒弟,可以有很多个:  不合法:  1) . 互为师徒:(有回路)  2) .你的师父是你徒弟的徒弟,或者说你的徒弟是你师父的 ...

  4. [LeetCode] Second Minimum Node In a Binary Tree 二叉树中第二小的结点

    Given a non-empty special binary tree consisting of nodes with the non-negative value, where each no ...

  5. [LeetCode] Minimum Absolute Difference in BST 二叉搜索树的最小绝对差

    Given a binary search tree with non-negative values, find the minimum absolute difference between va ...

  6. Expm 10_1 带负权值边的有向图中的最短路径问题

    [问题描述] 对于一个带负权值边的有向图,实现Bellman-Ford算法,求出从指定顶点s到其余顶点的最短路径,并判断图中是否存在负环. package org.xiu68.exp.exp10; p ...

  7. tarjan算法-解决有向图中求强连通分量的利器

    小引 看到这个名词-tarjan,大家首先想到的肯定是又是一个以外国人名字命名的算法.说实话真的是很佩服那些算法大牛们,佩服得简直是五体投地啊.今天就遇到一道与求解有向图中强连通分量的问题,我的思路就 ...

  8. 【2018 ICPC亚洲区域赛徐州站 A】Rikka with Minimum Spanning Trees(求最小生成树个数与总权值的乘积)

    Hello everyone! I am your old friend Rikka. Welcome to Xuzhou. This is the first problem, which is a ...

  9. 非负权值有向图上的单源最短路径算法之Dijkstra算法

    问题的提法是:给定一个没有负权值的有向图和其中一个点src作为源点(source),求从点src到其余个点的最短路径及路径长度.求解该问题的算法一般为Dijkstra算法. 假设图顶点个数为n,则针对 ...

随机推荐

  1. vuejs-devtools

    先看看http://www.cnblogs.com/zhnaglei/p/7121482.html 这里的方法. 如果出现vue.js not detected之类的错误.试试用调试模式,就是用npm ...

  2. ku8eye 安装概览

    ku8eye web 开发环境 当前版本的 ku8eye web开发环境 以docker镜像方式提供,下载地址为: http://pan.baidu.com/s/1gdYk4CV 文件名说明: ku8 ...

  3. maya2014卸载/安装失败/如何彻底卸载清除干净maya2014注册表和文件的方法

    maya2014提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装maya2014失败提示maya2014安装未完成,某些产品无法安装,也有时候想重新安装maya ...

  4. 关于Android的Service知识点,你知道吗?

    目录 学习Service相关知识点: 概述: Service生命周期: Service的基本用法: 服务. 问:达叔,今日工作累吗? 答:累啊,那么问你,你知道Android中的 Service(服务 ...

  5. Swift5 语言指南(十一) 结构和类

    结构和类是通用的,灵活的结构,它们成为程序代码的构建块.您可以使用与定义常量,变量和函数相同的语法来定义属性和方法,以便为结构和类添加功能. 与其他编程语言不同,Swift不要求您为自定义结构和类创建 ...

  6. Jmeter参数化的方法

    测试接口时,使用Jmeter在请求中输入参数,若是有多种情况,有多条测试参数,是不是要每个情况逐条输入呢?逐条输入会让人觉得比较麻烦,因此,就有了Jmeter参数化. Jmeter参数化的方法: 用户 ...

  7. 测试工具之Jmeter(使用badboy录制脚本)

    前面使用badboy工具时说过,badboy是可以录制Jmeter的测试脚本,这样省去了自己设计测试用例的麻烦 Jmeter主要是一个性能测试工具,不光在web和http,现在扩展很多功能都可以在Jm ...

  8. php -- 目录、路径、磁盘

    ----- 028-dir.php ----- <!DOCTYPE html> <html> <head> <meta http-equiv="co ...

  9. Netty源码分析之服务启动

    本节主要分析server的启动过程. Netty是基于Nio实现的,所以也离不开selector.serverSocketChannel.socketChannel和selectKey等,只不过Net ...

  10. 二、Windows下TortoiseGit的安装与配置

    TortoiseGit 简称 tgit, 中文名海龟Git. 海龟Git只支持神器 Windows 系统, 有一个前辈海龟SVN, TortoiseSVN和TortoiseGit都是非常优秀的开源的版 ...