用網路流做二分圖匹配(bipartite matching via flow)
假設左邊有申請者、右邊有職缺,每當某申請者勝任某職缺就畫一條線。你想盡量多錄取人,每人至多一個職缺、每個職缺至多一人。這就是最大二分圖匹配,而一個小技巧能把它化為你已會解的流量問題。
建一個流量網路:加一個源點 s,從它向每個左頂點連一條容量 1 的邊;從每個右頂點向匯點 t 連一條容量 1 的邊;對每條原本的勝任邊,連一條由左到右、容量 1 的邊。現在執行任一最大流演算法。因為所有容量都是 1,整數性定理保證存在整數最大流,而在這樣的流裡,每個左頂點至多送出 1 單位、每個右頂點至多收到 1 單位——正是匹配的約束。左右之間載 1 單位的邊構成一個最大匹配,而最大流的值等於最大匹配的大小。一條殘餘增廣路徑恰對應一條使匹配增長的交錯路徑(alternating path),所以流的機制與古典匹配理論其實是同一件事的兩種樣貌。
這個歸約是把組合問題建模成流的典範例子,而且確實有用:埃德蒙茲-卡普或 Dinic 可直接求解,其中 Dinic 在這些單位容量網路上以 O(E * sqrt(V)) 執行(Hopcroft-Karp 的界)。它也免費引進了流的對偶——這個網路上的最大流最小割定理化為 Konig 定理(二分圖中最大匹配等於最小頂點覆蓋)。唯一的提醒:這個乾淨的歸約是給二分圖的。一般(非二分)匹配也是多項式的,但需要 Edmonds 的花朵(blossom)演算法,而非樸素的流,因為奇環會破壞這個簡單的構造。
三位申請者 {A, B, C}、三個職缺 {1, 2, 3},勝任關係為 A-1、A-2、B-1、C-3。流量網路沿 s->A->2->t、s->B->1->t、s->C->3->t 各送 1 單位,值為 3——完美匹配。若改為只有 A 與 B 且都只能做職缺 1,最大流會是 1:瓶頸割揭示兩位申請者爭奪同一個職缺。
單位容量把「各至多一個」化為容量約束;整數最大流就是同等大小的最大匹配。
這之所以可行,是因為圖是二分的(無奇環)。一般圖需要 Edmonds 的花朵演算法——在無向非二分圖上樸素地跑最大流並不能正確模擬匹配。