這是一個困擾了我很久的問題,最近在算導上看到了 H-K 算法,網上提到復雜度證明的較少,故在 Wiki 上翻了一下並進行簡單翻譯和補充以造福社會
垃圾百度百科竟然是 Wiki 的機翻
Dinic 和 Hopcroft-Karp 算法的思路是每一次找到若干條最短的增廣路同時增廣。先給出結論:在左部點和右部點中較多的點數為 \(N\)、邊數為 \(M\) 的二分圖上使用 Dinic 或 Hopcroft-Karp 算法求解最大匹配的最劣時間復雜度是 \(O(M \sqrt{N})\) 的,下面給出簡單的證明。
首先給出一個結論:
- 在某一輪增廣過程結束后,下一輪增廣過程的增廣路長度一定比這一輪的增廣路長度長。
Proof. 使用反證法。
假設下一輪的增廣路徑不長於這一輪的增廣路徑。如果在下一輪的所有增廣路中存在一條增廣路沒有退這一輪的任何增廣路的流,那么因為這條增廣路徑要么比這一輪的增廣路徑短,要么一樣長,所以要么這一輪的增廣路不是最短的,要么這一條增廣路也應該在這一輪一起增廣,矛盾。
所以只需要考慮下一輪的增廣路退了這一輪增廣路的流的情況。假設兩條增廣路分別是 \(A \rightarrow B \rightarrow C \rightarrow D\) 和 \(E \rightarrow C \rightarrow B \rightarrow F\),那么可以得到 \(A \rightarrow B \rightarrow F\) 和 \(E \rightarrow C \rightarrow D\) 這兩條增廣路一定存在一條比 \(A \rightarrow B \rightarrow C \rightarrow D\) 短,所以 \(A \rightarrow B \rightarrow C \rightarrow D\) 並不是最短增廣路,矛盾。
所以每一輪的增廣長度一定是遞增的。而邊的流量都是 \(1\) 所以增廣一輪的復雜度是 \(O(M)\) 的,故對於增廣路長度 \(\leq \sqrt{N}\) 的所有路徑,需要 \(O(M\sqrt{N})\) 的時間進行增廣。
增廣完了這些路徑后,接下來的增廣路徑長度 \(> \sqrt{N}\)。設當前得到的匹配為 \(P\),選一個原圖的最大匹配 \(Q\),那么 \(P \oplus Q\)(\(\oplus\) 指對稱差)會是一些路徑和若干個環的並集。對於環我們可以調整 \(Q\) 將這個環從對稱差中消去,那么可以找到一個 \(Q\) 使得 \(P \oplus Q\) 中只有若干條路徑。此時 \(P \oplus Q\) 的邊數是 \(O(N)\) 級別的,因為一個點最多與兩個點在這個圖上相連。同時這個圖一定可以划分為邊不交的若干條路徑,使得每一條路徑都是 \(P\) 匹配的增廣路,沿着這些路徑增廣就可以得到最大匹配 \(Q\)。
總共只有 \(N\) 條邊,可以划分為若干條邊不交的路徑,每一條路徑的長度至少是 \(\sqrt{N}\),所以至多只有 \(\sqrt{N}\) 條路徑,即 \(|Q| - |P| \leq \sqrt{N}\)。每一條增廣路最劣情況下需要 \(O(M)\) 的時間增廣,所以這一部分也是 \(O(M \sqrt{N})\) 的。
所以加起來就是 \(O(M \sqrt{N})\) 的。