最大流之sap演算法

2022-07-29 04:42:10 字數 1192 閱讀 5462

若有向圖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...