網路流、割與匹配

最小成本最大流(min-cost max-flow)

樸素最大流只問你能運多少。但每根管子往往還有每單位的運價,而在所有能運出最大量的方法中,你想要最便宜的那個。或者你固定一個要運的目標量,把它的成本最小化。最小成本最大流恰好回答這點:盡量推送最多的流,而在所有最大流中,找一個總成本最小的。

設定在每條邊上、與其容量並列,加一個每單位流量的成本 a(u, v)。流 f 的成本是對各邊的 a(u, v) * f(u, v) 求和,目標是一個使此和最小的最大值流(或一個給定目標值、成本最小的流)。關鍵工具是逐次最短路徑法:反覆在殘餘網路中找一條成本最小(最便宜,而非邊數最短)的增廣路徑並沿之推送。殘餘網路也必須帶成本——一條後向殘餘邊的成本是 減 a(u, v),因為撤銷流量會退回它的價錢。由於邊成本可能為負(那些後向邊),你用貝爾曼-福特找最便宜的增廣路徑,或在做位勢重新賦權(Johnson 技巧)使所有縮減成本非負後改用戴克斯特拉。一個乾淨的不變量讓它正確:若你總是沿最便宜的路徑增廣,流對其當前的值始終是最小成本流,故最終的最大流也是最小成本的。

最小成本最大流是「帶成本的指派」問題的主力:指派問題(把工人配到工作以最小化總成本)、運輸與物流,以及許多既要最大吞吐又在乎價錢的排程問題。它同時推廣了最短路徑(單一最便宜的流量單位)與最大流(忽略成本)。誠實的提醒:它比樸素最大流更重——逐次最短路徑大致以 O(V * E * f) 執行,或用位勢以每單位值風格的 O(f * (E + V log V)) 為界,故極大的流值會吃虧——而你必須用一個能容忍負成本後向邊的方法,這正是為何單用樸素戴克斯特拉不夠。

從 s 到 t 有兩條路線、容量皆為 1:路線 1 每單位成本 5、路線 2 為 8。要運 1 單位,最小成本最大流選路線 1(成本 5)。要運 2 單位(最大量),它必須兩條都用,總成本 13——即使路線 2 單獨較貴,也沒有更便宜的方式來移動 2 單位。

先沿最便宜的路徑增廣;持續維持的最小成本不變量使最終的最大流也是最低成本。

後向殘餘邊有負成本,所以你不能用樸素的戴克斯特拉找最便宜的增廣路徑——請用貝爾曼-福特,或配 Johnson 式位勢的戴克斯特拉。而成本隨流值增長,故大的目標流可能很慢。

又稱
MCMFminimum-cost flowmin-cost flow最小費用最大流