430 likes | 674 Views
主題: Maximum flow. 解題技巧 問題定義 Ford-Fulkerson method Bipartite matching Minimum cost flow 例題講解 : A820, A10330, A563, A10080, H91.1 歷年題目. 問題定義. 給定一個 flow network G=(V, E) directed graph 兩個特殊的 vertex : s (source) 及 t (sink) 每一條 edge (u, v) 上有 capacity c[u, v]
E N D
主題:Maximum flow • 解題技巧 • 問題定義 • Ford-Fulkerson method • Bipartite matching • Minimum cost flow • 例題講解: • A820, A10330, A563, A10080, H91.1 • 歷年題目
問題定義 • 給定一個 flow network G=(V, E) • directed graph • 兩個特殊的 vertex:s (source) 及 t (sink) • 每一條 edge (u, v) 上有 capacity c[u, v] • 求從 s 到 t 之間最大的運送量(flow) • 每條 edge 上的運送量不可以超過該 edge 上的 capacity
問題範例 • vertex 表示城市,edge表示高速公路,capacity 表示該段公路最大的運輸量 新竹 台中 12 v1 v3 20 16 s 台北 4 高雄 10 t 7 9 13 4 v2 v4 14 花蓮 台東
s t s t 直覺想法 • 從 s 往 t 一直送,直到不能再送為止 • 正確,但需做一些修正 運送量 = 1 運送量 = 2
s t 直覺想法再延伸 • 允許反悔:如果從 u 到 v 有大小為 x 的運送量,表示在這之後從 v 到也可以有至多為 x 的運送量,相反方向的同數量的運送量則會互消
定義flow • 運輸量=19 時可能的運法 flow capacity 12/12 v1 v3 15/20 11/16 s 1/4 10 t 7/7 4/9 8/13 4/4 v2 v4 11/14 • 紅字部份稱為這個 graph 的 flow • f[s, v1] = 11
flow 必須符合以下性質 • 容量限制:f[u, v] c[u, v] • 對稱性:f[u, v] = -f[v, u] • 守恆性:for all uV {s, t}, 12/12 v1 v3 11/16 s 1/4 f[v1, s]+f[v1, v2] + f[v1, v3] = -11 + -1 + 12 = 0 10 v2
定義: residual graph Rf 12/12 v1 v3 c 及 f 15/20 11/16 s 1/4 10 t 7/7 4/9 8/13 4/4 v2 v4 Rf 11/14 12 v1 v3 5 5 11 4 15 s 可以想像為還有多少容量可以流過的圖 11 3 t 7 5 5 8 4 3 v2 v4 r[u, v] = c[u, v] – f[u, v] 11
argumenting path 定義: augmenting path • augmenting path:在 Rf上任一條從 s 到 t 的 path Rf 12 v1 v3 5 5 11 4 15 s 11 3 t 7 5 5 8 4 3 v2 v4 11
使用之資料結構 • 將 capacity c[i, j],flow f[i, j] 及 residual graph 的 r[i, j] 以 3 個 nn 的 matrix 儲存 • c[i, j] 在程式執行過程中不會改變 • f[i, j] 初始值為 0,每次找到 augmenting path 之後會被更新 • r[i, j] = c[i, j] – f[i, j],找 augmenting path 時會利用到之 matrix
解法: Ford-Fulkerson method • 步驟1:把 f 歸零 • 步驟2: • 當 residual graph Rf還可以找到 augmenting path p • 以 augmenting path p 更新 flow f • 以 flow f 更新 residual graph Rf • 步驟3:回傳 f
找 augmenting path 的方法 • 從 s 開始做 DFS (depth first search),找出 s 到 t 的任意一條可能路徑 • 注意:DFS 是在 residual graph Rf上做 12 v1 v3 Rf 5 5 11 4 15 s 11 3 t 7 5 5 8 4 3 v2 v4 11
v2 v3 s t s 12 更新 v2 0 -12 v3 19 更新 flow p s v2 v3 t m = min{ f[u, v] | edge (u, v) is on p} for each edge (u, v) on p f[u, v] = f[u, v] + m f[v, u] = - f[u, v] 5 4 5 m = 4 v2 v3 s t s 8 v2 -4 -8 v3 15
更新 residual graph • 以最新的 flow f 更新 residual graph Rf m = min{ f[u, v] | edge (u, v) is on p} for each edge (u, v) on p f[u, v] = f[u, v] + m f[v, u] = – f[u, v] r[u, v] = c[u, v] – f[u, v] r[v, u] = c[v, u] – f[v, u] 更新 residual graph Rf
Maximum flow 的大小 • 計算從 s 流出的 flow 總和 12/12 v1 v3 19/20 11/16 s 1/4 10 t 7/7 9 12/13 4/4 v2 v4 11/14 Maximum flow = |f| = 11 + 12 = 23
t s Multiple sources and sinks • 增加一個 super-source s,指向所有 si • 增加一個 super-sink t,所有 ti指向它 • 所有新增的 edge 之 capacity 設為 (可設為原圖中所有 capacity 的總和) s1 t1 s2 t2 s3
例題: A820 網路頻寬 • 假設在一個網路中有 n 個點,這 n 個點兩兩之間可能有一線路相連且此一連線有流量的限制(各連線不盡相同) • 連線的流量是無方向性的(undirected) • 給定 s 及 t 兩點,求 s 到 t 之間的最大頻寬,即從 s 到 t 的最大流量
解法: 將 undirected 轉為 directed 拆解為 20 20 1 2 1 2 20 1 2 3 4 c[i, j] 20 1 1 2 2 5 10 10 3 3 4 20 4
例題: A10330 電力輸送問題 • 從甲城市要輸電到乙城市 • 中間會經過一些電力轉換站,每個轉換站有本身的電力處理能力上限 • 各轉換站之間以電纜連接,甲、乙城也各以電纜跟這些轉換站相連,這些電纜各有各的電量流經上限 • 電纜的電流有方向性 • 求甲城可輸送到乙城的最大電量
3 12 拆解為 10 10 a1 a2 4 9 處理點上有流量限制的方法 • 解法:將每個轉換站拆為兩點 • 點 a 拆為 a1及 a2兩點 • a 的 in-edge 連到 a1,a 的 out-edge 連到 a2 • 新增一條 edge 從 a1到 a2,上面的 capacity 為 a 點的流量限制 3 12 10 a 4 9 10
例題: A563 搶匪逃逸路線 • 有一個城市的街道圖為方形網格,銀行座落在某些交點處 • 有一群搶匪想要搶銀行(每個人搶的銀行皆不相同) • 若逃到網格的外圍點就算逃逸成功,試問他們有沒有互不相交(不能共線或共點)的逃離路線
範例 • 有互不相交逃逸路線的例子 搶匪 逃逸路線
s t 拆解為 入 出 解法: • 結合前面的三種技巧 • 網格上的 edge 由 undirected 拆為 directed • 網格上的點拆為兩點(一為進, 一為出) • 新增點 s 連至所有搶匪,點 t 至所有外圍點 匪
Maximum flow 之應用: 配對問題 • maximum bipartite matching • 給定兩組人,一組為男生,一組為女生 • 男生與女生之間有一條 edge 表示互相同意交往 • 求最多的配對方法
甲男 甲女 乙男 t s 乙女 丙男 丙女 丁男 解法 • 以 multiple sources/sinks 方法解之,所有的 edge weight 皆為 1,maximum flow 即為最多的配對數
例題: A10080 地鼠逃生 • 在一個地圖上有 n 隻地鼠,m 個洞,一個洞只能躲一隻地鼠 • 地鼠與洞的位置為 2 維座標 • 地鼠的行走速度為 v • 老鷹來了,若地鼠不在 s 秒鐘內找到棲身之所就會被吃掉 • 試問最多可以救幾隻地鼠
解法: • 每一隻地鼠為左邊點 • 每一個洞為右邊點 • 對每一隻地鼠,連一條 edge 到座標為 sv 距離內的所有的洞 1 鼠 洞 2 1 3 a 2 a 3 sv = 3 0.5 = 1.5
Minimum cost flow 問題 • Maximum flow 問題的更一般化版本 • directed graph • 兩個特殊的 vertex:s (source) 及 t (sink) • 每一條 edge (u, v) 上有 capacity c[u, v] • 每一條 edge (u, v) 上有 cost h[u, v],表示從 u 送一個單位到 v 所需要付出的代價 • 流量要求 x • 求由 s 送 x 個單位到 t 的最小 cost
1/3 1/3 3/5 3/5 s s t t 2/5 2/5 6/2 6/2 1/5 1/5 (33+31) + (23+22+21) = 12+ 12 = 24 範例 • 從 s 要送 5 單位到 t cost/capacity 3 2 (33+31) + (26+21) = 12+ 14 = 26
解法: 修改 Ford-Fulkerson method • 步驟1:把 f 與 sum 初始化為零 • 步驟2:當 sum < x • 在 Rf中找到cost 最小的 augmenting path p • 以 augmenting path p 更新 flow f 與 sum • 以 flow f 更新 residual graph Rf • 步驟3:回傳 f 的 cost
找 cost 最小的 augmenting path • 在 Rf上找一條由 s 到 t 的 shortest path • 以 h[u, v] 作為 edge length • 若 r[u, v] = 0 表示 edge (u, v) 不存在 在沒有edge 的地方,其 cost 值不需理它,因其 r[] 值恆為 0 h r 0 13 5 1 9 1 0 2 12
以 p 更新 flow f 及 sum 值 • 若 (sum + m) > x 表示這一次不必送這麼多的 flow,實際上只需再送 xsum 個單位 m = min{ f[u, v] | edge (u, v) is on p} if (sum+m) > x then m = x – sum; sum = sum + m for each edge(u, v) on p f[u, v] = f[u, v] + m f[v, u] = - f[u, v]
計算 minimum cost • 將所有 f[i, j]c[i, j] 加總 ans = 0 for i = 1 to n do for j = 1 to n do if f[i][j]>0 then ans = ans + f[i][j] c[i][j] return ans
Multiple sources and sinks • 每個 source 皆有其各自發送量,每個 sink 皆有其各自接收量,總發送量=總接數量 • 增加一個 super-source s 指向所有 si,edge capacity 為 si之原發送量 • 增加一個 super-sink t ,所有 ti 指向它,edge capacity 為 ti之原接收量 • 所有新增 edge 的cost 都設為 0
轉為 cost/capacity 0/5 t s 0/7 0/3 0/10 0/9 範例 送5 收7 送3 收10 送9
例題: H91.1 沙石供應場 • 甲、乙、丙三個地方在施工。此三個工地所需的砂石由 A、B、C 三個採砂場供應。A、B、C 三個採砂場每天分別可採 X1、X2 、 X3 噸,每噸生產費用分別為M1 、 M2 、 M3 元。而甲、乙、丙三地每天需用砂石分別為 Y1 、 Y2 、 Y3 噸 • 從 A 運往甲、乙、丙三工地每噸運費分別為 N1 、 N2 、 N3 元,從 B 運往甲、乙、丙三地每噸的運費分別為 N4 、 N5 、 N6 元,從 C 運往甲、乙、丙三地每噸運費分別為 N7 、 N8 、 N9 元 • 試計算滿足工地所需全部砂石的最少費用運輸方案
當工地與採砂場數目很小時 • 解法:暴力法 • 存在一組最佳解具有下列性質 • 把所有 edge 轉為 undirected 的情況下,運輸方案圖中不會有 circle(證明一) • 故運輸方案圖可視為一個 forest • 一定有一個 leaf 具有下面其中一種性質 • 若 leaf 為採砂場,它把沙全運輸到某一工地(證明二) • 若 leaf 為工地,它所需的沙全來自某一採沙場(明顯)
< 證明一 • 利用反證法
< 全送 剩 剩 證明二 • 利用反證法 剩 剩
A 送甲 A 送乙 C 送丙 ... 或 或 ... A 已空 甲已滿 C 已空 丙已滿 recursive 乙 丙 甲 A B C
多工地與採砂場之解法 cost/capacity (M1+N1)/X1 (M1+N2)/X1 甲 A 0/Y1 0/X1 0/X2 0/Y2 t 乙 s B 0/Y3 0/X3 丙 C 發送量 = 接收量 = Y1 + Y2 + Y3
練習題 • 練習題 • A.820 Internet Bandwidth • http://acm.uva.es/p/v8/820.html • A.10330 Power Transmission • http://acm.uva.es/p/v103/10330.html • A.10080 Gopher II • http://acm.uva.es/p/v100/10080.html • A.10092 The Problem with the Problem Setter • http://acm.uva.es/p/v100/10092.html • A.670 The Dog Task • http://acm.uva.es/p/v6/670.html • A.753 A Plug for UNIX • http://acm.uva.es/p/v7/753.html
挑戰題 • 挑戰題 • A.563 Crimewave • http://acm.uva.es/p/v5/563.html • A.10511 Councilling • http://acm.uva.es/p/v105/10511.html • H. 91.1 (輸入較小時使用暴力法) • http://www.cc.nccu.edu.tw/info_race2002/codeq.htm • H. 91.6 (輸入較小時使用暴力法) • http://www.cc.nccu.edu.tw/info_race2002/codeq.htm • H. 88.2 (輸入較時使用暴力法) • http://www.cc.nccu.edu.tw/info_race88/Q.pdf