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

文件链接

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

本人翻译(有删改):

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

Theorem 1

(1)λ=minvVmax0kn1[Fn(v)Fk(v)nk]

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

Lemma 2

如果λ=0,那么

minvVmax0kn1[Fn(v)Fk(v)nk]=0

Proof. 由于 λ=0 , 存在一个零环,但不存在负环。由于没有负环,从 sv 一定存在最短路(指取值和最小路径),且路径上边的条数不超过 n 。令其权值和为 π(v) , 则 Fn(v)π(v) , 且 π(v)=min0kn1Fk(v) , 所以

Fn(v)π(v)=max0kn1[Fn(v)Fk(v)]

又由Fn(v)π(v)

(2)max0kn1[Fn(v)Fk(v)nk]0

(2) 中等号成立当且仅当 Fn(v)=π(v) . 现在我们只需要证明存在这样一个节点就可以完成此引理的证明。由条件可知,图中存在零环。令此零环为 C ,在环上任选一点 x , 沿环上的边走若干步后到 x , 那么 sxy 一定是一条 sy 最短路(不然的话,有某条路径sy权值和小于这条路径,我们就可以走syx,第二部分路径在环上走,容易发现这样是更短的sx路径,与最短路不符)。那么,从 x 出发沿零环走若干步直到 sxy 上有n条边时,就有 Fn(y)=π(y) , 即max0kn1[Fn(v)Fk(v)nk]=0. 证毕。

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

minvVmax0kn1[Fn(v)Fk(v)nk]

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

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

Fk(v)=min(u,v)E[Fk1(u)+w(u,v)],k=1,2,...,n

其初始条件

F0(s)=0;F0(v)=,vs

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

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

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

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

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

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

λ=minvV,Fn(v)max0kn1[Fn(v)Fk(v)nk]

posted @   _rqy  阅读(4683)  评论(7编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示