Karp在1977年的論文,講述了一種\(O(nm)\)的算法,用來求有向強連通圖中最小平均權值回路(具體問題請參照這里)
本人翻譯(有刪改):
首先任取一個節點 \(s\) ,定義 \(F_k(v)\) 為從 \(s\) 到 \(v\) 恰好經過 \(k\) 條邊的最短路(不存在則為 \(\infty\) ), \(\lambda^*\) 表示答案,則
Theorem 1
定理1的證明需要一個引理。
Lemma 2
如果\(\lambda^* = 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) \geq \pi(v)\),
\((\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\) ,
也會增加 \(c\) . 所以定理1等號兩邊都增加了相同的量,仍然成立。據此,若給定任意一個圖,我們將它的所有的邊都同時減去某個數\(c\)(有可能小於0),使得存在零環而無負環,這時定理成立;我們再把每條邊都加上\(c\),就可以得知原圖中定理成立。 證畢。
我們可以通過下述遞推式求出所有 \(F_k(v)\) :
其初始條件
由於每條邊會被松弛 \(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\)點之后,