若有向圖g = (v , e)滿足下列條件:
1、有且僅有乙個頂點s,它的入度為 0 ,這個頂點稱為源點。
2、有且僅有乙個頂點t,它的出度為 0 ,這個頂點稱為匯點。
3、每一條弧都有乙個非負數,叫做這條邊的容量,邊(vi , vj)的容量用 cij 來表示。
則此有向圖稱為網路流圖,記為 g = ( v , e , c) ;
對於網路流圖g中,每一條弧( i , j )都給定乙個非負數fij,對於一組資料滿足下面三個條件時,稱為可行流;
1、對於每條弧都有 fij < cij ;
2、出了源點s和匯點t之外,中間任意點流量守恆,即輸入流等於輸出流;
3、對於源點s和匯點t,從s出去多少就會從t流入多少;
假如有這麼一條路,從源點開始,一直一段一段的連到了匯點,並且這條路上的每一段滿足fij < cij ,則稱這條路為增廣路;
當找不到增廣路時,當前流量就是最大流。
尋找增廣路時可以簡單地從源點開始做bfs,並不斷修改這條路上的最大流。
但事實上並不是這麼簡單,上面所說的增廣路還不是很完整,中間還存在一些細節問題,例如:
我們通過bfs遍歷後得到第一條增廣路 1 - 2 - 3 - 4 ,然後就不存在增廣路徑了,其實並不是這樣,這個網路流的最大流明顯為 2 ,我們可以是使用乙個叫反向邊的概念來解決這個問題,如圖:
這樣就解決了增廣路演算法中的一些細節問題;
加入乙個網路圖中有4個點,5條邊組成。如下:
5 41 2 40
1 4 20
2 4 20
2 3 30
3 4 10
求最大流是多少?
下面給出相應的**:
#include#includeusing namespace std ;int n , m ;
int map[210][210] ;
int path[210] ;
int flow[210] ;
int bfs()
edmonds_karp() ;
} return 0 ;
}
最大流SAP演算法
求最大流有一種經典的演算法,就是每次找增廣路時用bfs找,保證找到的增廣路是弧數最少的,也就是所謂的edmonds karp演算法。可以證明的是在使用最短路增廣時增廣過程不超過v e次,每次bfs的時間都是o e 所以edmonds karp的時間複雜度就是o v e 2 如果能讓每次尋找增廣路時的...
最大流SAP演算法
求最大流有一種經典的演算法,就是每次找增廣路時用bfs找,保證找到的增廣路是弧數最少的,也就是所謂的edmonds karp演算法。可以證明的是在使用最短路增廣時增廣過程不超過v e次,每次bfs的時間都是o e 所以edmonds karp的時間複雜度就是o v e 2 如果能讓每次尋找增廣路時的...
網路流最大流之SAP演算法 詳解
網路流最大流之sap演算法 首先引入幾個新名詞 1 距離標號 所謂距離標號 就是某個點到匯點的最少的弧的數量 即邊權值為1時某個點到匯點的最短路徑長度 設點i的標號為level i 那麼如果將滿足level i level j 1的弧 i,j 叫做允許弧 且增廣時只走允許弧。2 斷層 本演算法的ga...