算法: 最大流與最小割

什么是最大流

最大流要解決的問題是從 S 到 T 怎么才能最大地將數(shù)據(jù)運到另一邊。這個“數(shù)據(jù)”可以是水,或者網(wǎng)絡數(shù)據(jù)包。舉個例子

在上面這個圖中將數(shù)據(jù)從 S 運到 T,其中邊的權值稱為 Capacity 即,在這條邊中流動的數(shù)據(jù)不能超過 Capacity 值,flow \leq capacity

這個圖很簡單,我們很容易就看出來最大流是 5。流動方向為

  1. S - 1 - T: 2
  2. S - 1 - 2 - T: 1
  3. S - 2 - T: 2

那最小割是啥?就是一堆邊的集合,這些邊權重加起來應該是要等于最大流的值,且這些邊都是從 S 那邊到 T 這邊的。

簡單思路

我們先來大概想個方法去找最大流。其實找最大流的簡單方法就是一條路一條路試唄,剛好試到上面三條路就發(fā)現(xiàn)是最大的了。

但是總有不如意的時候,比如我們先走 S - 1 - 2 - T,用了流 3,那么整個網(wǎng)絡可以再嘗試的路只剩下這些了:

現(xiàn)在我們就陷入僵局了,沒路可以嘗試了,最大流就變成了 3,明顯錯了。正確的做法應該是這次沒找到好的可以進行“反悔”操作,回退上一步之類的,然后再去嘗試找最大流嘛。這就需要用到殘余網(wǎng)絡了。

殘余網(wǎng)絡

殘余網(wǎng)絡也叫做 Residual Network,它的出現(xiàn)可以使得我們每次找路的時候進行 “反悔” 操作。比如上面走了 S - 1 - 2 - T 后,殘余網(wǎng)絡是這樣的

可以看到正向走了多少,那么就畫一條反向邊,這條邊的權值就等于前面走了多少流。因為現(xiàn)在有邊 2 -> 1 了,所以可以找到一條路 S - 2 - 1 - T,用了流 2,再加上前面找的 3,所以最大流是 5。

這就做完了,其中最小割就是集合 {S - 1, S - 2}: 5。這里所找的路叫做 Augmenting path,反正就是 path,不用去管前面那個是什么意思。

Ford-Fulkerson 算法

畫圖好畫,那程序上怎么實現(xiàn)呢?其實程序上我覺得更容易。偽代碼如下

  • 首先初始化 Residual Network G
  • 使用 DFS 或者 BFS 去找 Augmenting Path,找到一個就加入到 Residual Network G
  • 因為使用了之后邊是反過來的,所以總會出現(xiàn) S 走不到 T 的時候,那個時候就停止算法即可
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 最大流&&最小費用最大流&&最大二分匹配 中文是2017年8月的筆記,英文是2018.11月的筆記 英文筆記來自于...
    廖少少閱讀 35,718評論 6 20
  • 所有結點對的最短路徑問題 Floyd算法 前提條件: 可以有負權重邊, 但是不能有負權重的環(huán). 特點: 動態(tài)規(guī)劃,...
    陳碼工閱讀 1,805評論 0 1
  • 今年22,讀大三,閑來無事寫來逗趣,順便記錄一下自己的大學生活。 宿舍六個姑娘,我年紀最大95年,一個東北,一個新...
    第五個自我閱讀 279評論 0 0
  • 今天是母親回老家的第四天了,我仍不能適應重新剩下一個人的無所適從! 每天下了班,走到樓下,習慣仰頭看一眼窗,沒有了...
    鴿子lv閱讀 531評論 5 7
  • 感冒中 起床:8:00 就寢:21:59 天氣:陰有小雨 心情:有點難受 紀念日:又學了一門課 任務清單 改進:一...
    銀色樹葉閱讀 38評論 0 0

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