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


文件鏈接

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM