《演算法導論》筆記(18) 最大流 含部分習題
流網路,容量值,源結點,匯點,容量限制,流量守恆。反平行,超級源結點,超級匯點。
Ford-Fulkerson方法。殘存網路,增廣路徑,最小切割定理。f是最大流,殘存網路不包含增廣路徑,|f|等於最小切割容量三者等價。
基本的Ford-Fulkerson演算法。Edmonds-Karp演算法。為了演算法的收斂性。殘存網路中用廣度優先尋找增廣路徑。證明執行時間為O(V*E^2):對特定一條邊,其成為關鍵邊的次數最多為V/2,殘存網路最多有O(E)種可能的關鍵邊,每條增廣路徑至少一條關鍵邊,則關鍵邊的總數為O(VE),廣度優先搜尋的每次迭代代價是O(E),則總時間為O(V*E^2)。
最大二分匹配。
推送-重貼標籤演算法。由源點向外流動,初始化時用最大流量將與源點直接相連的結點充滿超額流,然後重貼高度標籤,升高有殘餘網路的溢位結點的高度,使超額流量向高度低的結點擴散,如此反覆執行溢位與標籤操作,直至所有除源點與匯點外的結點都無超額流。則得到最大流。
習題26.1-4 標量流積問題,證明流為凸集。對於任意的流f1及f2,假設f3= f1*a+f2*(1- a)。首先f3要滿足流量守恆,∑f(u, v)= ∑f(v, u),易知f3滿足流量守恆。其次要滿足容量限制。f3= f2+ a*(f1- f2),f3<= max(f1, f2),則f3(u, v)<=c(u, v)。則f3也是一個流。
習題26.1-5 最大流問題表述為線性規劃問題。f(u, v)為u到v路徑上的流量,各項有最大值c,f(u, v)<= c(u, v),各結點流量守恆,∑f(u, v)= ∑f(v, u)。變換為一組方程組。
習題26.1-7 結點容量問題。一個結點分割為兩個結點,彼此之間的最大流量設定為結點容量即可。
習題26.2-6 設定超級源點與超級匯點。超級源點到每個源結點的路徑最大容量是pi,而每個匯點到超級匯點的路徑最大容量是qi。
習題26.2-11 最大流演算法確定無向圖的邊連通性。因為最大流等於最小切割容量,設定所有邊容量為1,最大流為n,則源點與匯點之間最少有n條通路,需要刪除n條邊才能保證圖不連通。找到一個結點與其餘每個結點間最大流,則最大流的最大值就是連通值。
習題26.2-12 因為f(v, s)= 1,根據流量守恆,f中一定有另外一條路徑由s到v,殘存網路有一條至少容量為1由s經過v回到s的路徑。則存在f',將此路徑與f疊加,使得f‘中v到s流量為0. 找到此路徑的方法是在殘存網路中用BFS演算法尋找v到s容量至少為1的路徑。
習題26.4-8 證明Generic-push-relabel演算法維持u.h < |V|意味著u.h <= δf(u, t),維持u.h>=|V|意味著u.h-|V| <= δf(u, s)。因為殘存網路中u到v的距離為δf(u, v),則可知u.h <= v.h+δf(u, v)。若維持u.h < |V|,又有t.h=0,則結點u滿足u.h <= δf(u, t)。若維持u.h >= |V|,又有s.h = |V|,則滿足u.h - |V| <= δf(u, s)。
思考題26-1 逃逸問題。證明在結點和邊都有容量的流網路中確定最大流的問題可以規約為同等規模網路中的普通最大流問題。每個結點前放置一個結點,結點對設定為一個只能進,一個只能出,此二結點之間流量限制為結點容量,則與原問題等價。解決逃逸問題也是同理。每個結點增加一個伴隨結點,一隻能進一隻能出,結點之間容量為1,可按照一般的最大流演算法解。
思考題26-2 最小路徑覆蓋問題。假定V={1, 2, ... n},構建圖G'=(V', E'),其中V'= {x0, x1, ... xn} ∪ {y0, y1, ... yn},E'= { (x0, xi) } ∪ { (yi, y0) } ∪ { (xi, yj) },所有邊容量為1。在圖中執行最大流演算法,得到由源點x0的直接流入點 Vin = {xi: (x0, xi)在最大流中},與匯點y0的直接流出點 Vout = {yj: (yj, y0)在最大流中},兩個集合的元素數量應該相等,並且等於最小路徑覆蓋的數量,在最大流中從Vin出發,按照深度遍歷到達Vout,得到全部路徑。帶環路的情況則需要修改演算法,Vin與Vout的數量不等於最小路徑覆蓋的數量,而是需要從Vin出發深度遍歷到達Vout,統計出全部路徑。
思考題26-3 演算法諮詢。對於有限容量的切割(S, T),有Ji ∈ T,則對於每個結點Ak ∈ Ri,有Ak ∈ T。令Ay集合表示聘請專家的子領域,An集合表示不聘請,Jy集合表示接受的工作,Jn集合表示不接受的工作。則∑Py - ∑Cy為利潤。在圖中,最小切割的容量不可能包含有A到J邊,因為這些邊的容量都是無窮大。故屬於同一子集的A與J必然在切割的同一邊。因為∑Py - ∑Cy是利潤,而∑Py =∑P - ∑Pn,可知利率最大時,∑Cy + ∑Pn為最小。也恰好是最小切割容量。根據最大流最小切割定理,用S到T的最大流演算法可以解決。用全部工作的總營收值∑P 減去最小切割容量,即可得到最大利潤。