網路流、割與匹配

福特-富爾克森方法(Ford-Fulkerson method)

/ FORD-FULL-ker-sun /

極大化流量最自然的計畫也是最直接的:從零流開始,不斷找一條從源點到匯點、仍有空間的路線並沿之多倒一些,直到再也找不到這樣的路線為止。把這個計畫用殘餘網路精確化(使它也能撤銷先前的選擇),就是福特-富爾克森方法。它與其說是單一演算法,不如說是一個範本,因為它並未規定該選哪條路線。

方法如下:把每條邊初始化為 f = 0。當殘餘網路 Gf 中存在從 s 到 t 的增廣路徑 P 時,找出 P,算出它的瓶頸(沿路最小的殘餘容量),並沿 P 把流增廣那麼多。當不存在增廣路徑時,回傳 f。每次增廣都嚴格增加流值,而當它停止時,增廣路徑定理保證 f 是最大流;仍能從 s 抵達的頂點定義一個最小割,證明了最佳性。在整數容量下,每次增廣至少把值提高 1,故方法至多進行 |f*| 次增廣,其中 |f*| 為最大流值——時間複雜度為 O(E * |f*|)。

福特-富爾克森是所有最大流演算法在概念上的祖先,也是理解增廣路徑與最大流最小割定理最乾淨的場景。但「方法」一詞用得誠實:它讓路徑選擇懸而未決,而那個選擇影響甚巨。選得不巧時,O(E * |f*|) 這個界可能糟透(想像容量達數百萬但圖很小),而在無理數容量配上壞的選法時,它甚至可能不終止,收斂到真正最大值以下的某個值。埃德蒙茲-卡普藉由總是選最短的增廣路徑修正了這點,找回一個與容量無關的多項式界。

經典的壞例子:頂點 s、a、b、t,其中 s->a、s->b、a->t、b->t 容量皆為 1000,中間一條 a->b 容量為 1。若選擇穿過中間邊來回曲折的增廣路徑,每次只增廣 1,需約 2000 次迭代;若選那兩條顯然的直接路徑,2 次便完成。同一個方法,代價天差地別——正因為方法未指定選法。

福特-富爾克森是個範本;它的速度全繫於它刻意留白的路徑選擇規則。

O(E * |f*|) 的界取決於流值而非僅圖的大小——所以巨大的容量會使它變慢,而在無理數容量下,糟糕的路徑規則可能永不終止。需要保證時請用埃德蒙茲-卡普或 Dinic。

又稱
Ford-Fulkersonaugmenting-path method福特-富爾克森