算法設(shè)計(jì)與分析筆記之最大流/最小割問題

割(Cut)

s-t cut:(A, B),將圖分為兩部分A和B,源s∈A,終點(diǎn)t∈B
cut(A, B)的容量(capacity):所有流出A的邊的容量和,注意區(qū)分與流量(flow)的區(qū)別。
cap(A,B)=\sum_{e\,out\,of\,A}c(e)如下圖

割的大小

最小的s-t cut:具有最小的容量(capacity)。
??割實(shí)際就是,徹底切斷s與t的通信,需去掉的邊的容量之和。用最小的勞動力斬斷通信,即最小割。

對任意流,均滿足條件:

  1. ? e∈E,有f(e)≤c(e). 經(jīng)過任意邊的流量不大于該邊的容量。(通過水管的水量不超過水管的負(fù)載能力)
  2. ? v∈V - {s, t},\sum_{e\,out\,of\,v}=\sum_{e\,in\,to\,v}. 任意點(diǎn)流出的流量與流入這點(diǎn)的流量相等——流一致性。(每個水管節(jié)點(diǎn)不消耗也不憑空產(chǎn)生水)
流大小的定義

??對流f,其大小為流出該點(diǎn)(部分)流量之和與流入的流量之差。
??????????????val(f)=\sum_{e\,out\,of\,s\,or\,A}-\sum_{e\,in\,to\,s\,or\,A}

流的大小

最大流問題

兩個重要結(jié)論:

  1. 對任意流f,任意割(A, B),流的大小為流出A的流量與流入A的流量之差。例如,自來水中轉(zhuǎn)站一共能向外供應(yīng)的水量。
    ??????????????\sum_{e\,out\,of\,A}-\sum_{e\,in\,to\,A}=val(f)
  2. 任意流的大小不大于割的大小。v(f)≤cap(A, B). 例如,從我家到你家的自來水管的流量為520,若你惹我生氣了,我想切斷從我家到你家的自來水供應(yīng)。因此,我需要花費(fèi)不低于520的勞動力(割)??梢姡髁磕苓_(dá)到的最大值就是割的大小。

最大流與最小割

推論 若流大小與割大小相等,那么這一定是最大流。(前面的重要結(jié)論可以幫助理解)
如何尋找最大流?很容易想到的是貪心算法。

貪心算法求解最大流

思路:從流量為0的邊開始,選取s到t的路徑(需滿足流量不大于容量)并修改流量,不停添加增廣路徑,直到?jīng)]有為止,然后再從流量為0的邊開始重復(fù)操作。





貪心算法得出最大流16

實(shí)際最大流為19

貪心算法一旦提升了流量,就不再減小,沒有回溯不佳的路徑選擇。

Ford Fulkerson算法

增廣路徑:剩余圖中,s到t的簡單路徑。
瓶頸容量:一條增廣路徑的流量貢獻(xiàn),取決于這條路徑上所有邊的最小剩余容量.
??區(qū)別于貪心算法,我們每次在剩余圖中尋找s-t的簡單路徑。
??剩余圖的畫法

剩余圖

??舉例,下圖用貪心算法計(jì)算出最大流為20。
貪心算法得出的錯誤結(jié)果

??使用Ford Folkerson算法,每次更迭畫出剩余圖,剩余圖的相反路徑可用于回溯。
FF算法求出最大流為30

Q
??無向圖如何構(gòu)造剩余圖,如何求解最大流?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容