最大流最小割演算法入門理解

2021-08-10 16:02:55 字數 1403 閱讀 8792

最近在看maxflow相關的資料,本文主要介紹下自己對最大流和最小割的理解。最大流本來是網路流方面的演算法,後來在計算機視覺中也得到廣泛的應用,如圖割。我覺得要理解乙個演算法首先要從起源開始,然後再去泛化問題、建立模型,最後才是解決之。本文是以乙個新手的角度去理解演算法。

首先從最簡單的開始,先看一幅圖:

有3個節點s,a,t,邊[s,a]的容量是10,邊[a,t]的容量是5,假設從s處要傳送資料到t,問最大傳送資料量是多少?應該是min(10,5)=5.如果超出5,[a,t]邊容不下,因此傳不過去,此時的最大流量就是5,[a,t]邊就是該圖的一條最小割。該圖可以想象成從s到t通水,需要修建水管,a是中間站點,s到a修建的水管可以容納下10單位的水量,a到t可容下5單位的水量,現在有個人不想讓s到t通水了,那麼他得要切割水管,那麼應該切割哪條水管呢?假設切割水管付出的代價和水管容量成正比。顯然,他需要切割a到t的水管,而不會切割s到a的水管,此時的割是最小割,容量是5,最大流是5,所以最大流=最小割。當然這個例子太簡單,不能說明普遍問題。

來個稍微複雜的例子:

從s到t,中間經過a,b兩節點,問此時的最大流是多少?

首先找一條從s到t的路徑[s,a,t],該路徑的最大流量是min(2,3)=2,因為[s,a]上面的容量已經被用了,所以路徑[s,a,b,t]就行不通了,割去[s,a]後圖變成了以下形式:

該圖叫做殘留網路或者叫殘留圖,此時再找從s到t的路徑[s,b,t],路徑的最大流量是min(3,6)=3.割去[b,t]後,圖如下:

此時就不存在從s到t的可行路徑了,則結束最大流的查詢。此時的最大流是2+3=5,被割的邊容量和是2+3=5,即最大流=最小割。

兩個例子我們已經能理解最大流和最小割大體的含義了,也發現最大流的確和最小割是相等的。只從這兩個小例子就證明最大流和最小割相等是絕對不嚴格的,嚴格的數學證明可google相關資料。回頭思考下,最大流到底是什麼?如果以送貨為例,在可行的情況下,從乙個節點到另乙個節點所能送達的最大貨量即為最大流。打個比方,假設從s處開始放彈珠,讓其自動滾到t處,箭頭方向為下坡路,在不考慮時間和空間(即把彈珠想象成質點)的情況下,路徑中能容納的最大彈珠量即為最大流量,最小割就是把容納的彈珠量和容量相同的邊都割去,得到的割即為最小割,顯然最大流=最小割,因為最大流量完全由路徑和容量決定。割去這些邊之後,彈珠是沒法從s滾落到t的。

最大流 最小割

真是不知道該說些什麼呀 感覺這是我見到過的網上敘述最最最詳細的乙個演算法了。可見我才學過幾個演算法qwq 我並不認為我能比網上講的要好 所以 emmm 我就打算解釋一下 不要管這迷一樣的邏輯 先去看看題解hhh 咳咳 等會兒 好了好了 qwq 言歸正傳 這裡的dinic演算法,是對edmonds k...

網路流最大流最小割演算法

最大流演算法 不得不說網路流演算法是很讓人無語的演算法,要想高效率竟然要非遞迴實現深搜,很無奈,到現在還是在低效率中掙扎!最大流演算法的證明就不說了,無非就是最大流最小割定理的推導,定理描述如下 對於任意給定的網路d v,a,c 從出發點vs到收點vt的最大流的流量必等於分割的最小截集的容量!至於截...

最小割最大流記錄

經過一系列的學習,明白了一些東西記錄一下備忘 割 是指刪除一些邊,使剩下的網路中沒有增光路,那麼可以得出max flow c s,t 割 為什麼呢?首先我們明白知道最大流一定是根據增光路得到i的,那麼割就是包含增光路的乙個集合,那麼sum c s,t 一定是在在這個 基礎上得到的,也就是割中一定包含...