算法课 - 最大流问题
課程鏈接:
算法設(shè)計與分析-最大流https://www.icourse163.org/learn/BUAA-1449777166?tid=1465293450#/learn/content?type=detail&id=1244171114
一、流網(wǎng)絡(luò)
流量/容量都表示在邊上,有源點和匯點
幾個概念:剩余流量、總流量、流量限制(條件)、流量守恒(條件)
?
二、最大流問題描述
?在滿足約束條件的情況下,讓總流量最大。
三、最大流算法思想
直觀的描述算法(需要改進):
A:找出一條路徑,這條路徑點不重復(fù),并且找出剩余流量的最小值作為這條路徑的流量。
?迭代尋找路徑,重復(fù)步驟A,增加總流量:
?直到最后,我們再也找不到可以增加總流量的路徑結(jié)束。
?但是,發(fā)現(xiàn)這種策略不一定能找到最大流。
發(fā)現(xiàn)我們的直觀策略,如果在某個路徑上 +1 的話是無法增加總流量的,但是減小某些路徑的流量,將流量大小進行再分配之后發(fā)現(xiàn)是可以增加總流量的。
于是,我們思考怎么調(diào)整直觀的策略。。。。
因為縮減邊上的流量可以進一步增大總流量,因此引入反向邊代表縮減的邊流量。
這種反向邊的邊權(quán)如何定義?
為了保證流量調(diào)整的合理性,?我們可以由原始邊產(chǎn)生一組殘存邊:
?我們定義殘存網(wǎng)絡(luò)(也叫余圖)
?在殘存網(wǎng)絡(luò)(余圖)中尋找增廣路徑。
最終形成了Ford-Fulkerson算法(FFA)思想
總結(jié):我們算法改進的歷程(從直觀算法到Ford-Fulkerson算法)
四、示例分析
初始時刻的流網(wǎng)絡(luò)展示:
?將流網(wǎng)絡(luò)改造成殘存網(wǎng)絡(luò)(也就是他的余圖):
需要注意的是,其實每個路徑都有正向邊和反向邊,只不過為0的就省去了
尋找這個殘存網(wǎng)絡(luò)的增廣路徑:
于是在增加了這條增廣路徑之后,我們得到了新的流網(wǎng)絡(luò):
根據(jù)這個新的流網(wǎng)絡(luò)得到新的殘存網(wǎng)絡(luò):
?找到了新的殘存網(wǎng)絡(luò)之中的增廣路徑:
?得到新的流網(wǎng)絡(luò):
?基于新的流網(wǎng)絡(luò)更新殘存網(wǎng)絡(luò):
?發(fā)現(xiàn)新的增廣路徑:
更新流網(wǎng)絡(luò):
?重復(fù)以上的三步循環(huán)。。。。
最終當(dāng)無法發(fā)現(xiàn)新的增廣路徑的時候,算法可以終止。?
四、分析FFA
時間復(fù)雜度:O(mC)
其中C為最大流的值,m為邊數(shù)
DFS查找增廣路徑P?,每次的DFS的時間復(fù)雜度就是O(邊數(shù))
運行時間依賴于增廣過程:
五、如何證明FFA可以獲得最優(yōu)解
FFA的正確性證明
?
?充分性:
必要性:
直接證明比較困難:
證明需要借助中間問題證明
我們引入“割”的概念:將最大流問題轉(zhuǎn)化為最小割問題?
給出割的容量的概念:
注意在計算割的容量的時候,我們考慮的是容量而不是流量
下面給出割與流的關(guān)系的定理:流值定理
流值:注意是出去和進入的路徑的流量的差值
S的流出也就是最大流 =??
話說回來:
最小割找的是什么?
瓶頸總?cè)萘恳簿褪沁@個分割流出的容量也就是這個割的容量是最小的,想要讓輸送的更多,卡脖子的地方就是在這個 割 的地方。
于是又根據(jù)流值定理,我們得到最大流的流值小于等于最小割的容量。
回到我們的必要性證明
?從而
總結(jié)
以上是生活随笔為你收集整理的算法课 - 最大流问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【无标题】移动端深度学习开源框架及部署(
- 下一篇: 关于 HTTP 的一切(HTTP/1.1