最大流(一) Edmond Karp演算法

2022-07-25 08:15:11 字數 925 閱讀 2313

ek演算法為最短增廣路演算法,具體步驟:

1)初始化網路中所有邊的容量 c < u , v > 為該邊的容量,同時反向邊 c < v , u > 為0,初始化最大流為0。

2)在殘留網路中找一條從源s到匯t的增廣路p。如果能找到,轉步驟(3);如果不能找到,則轉步驟(5)。

3)在增廣路p中找到所謂的「瓶頸」邊,即路徑中的最小邊,記錄下這個值x,並且累加進最大流。

4)將增廣路中所有的 c < u ,v > 減去x,所有 c < v , u > 加上x,構成新的殘留網路。轉步驟(2)。

5)得到網路的最大流,退出。

在點數較少時比較有利

時間複雜度:o(n*m^2)

空間複雜度:o(n^2)

ek演算法**:

#includeusing namespace std;

const int maxn=110; ///最大點個數

const int inf=0x7fffffff;

int mp[maxn][maxn],n,p[maxn];

bool vis[maxn];

///mp:鄰接矩陣

///p:點的前驅

///vis:找增廣路時用於避免增廣點的重複選取

bool ek_bfs(int st,int ed) }}

return false; ///找不到增廣路

}int ek_max_flow(int st,int ed)

max_flow+=minn; ///累加進最大流

u=ed;

while(p[u]!=-1)

}return max_flow;

}int main()

cout

}///時間複雜度:o(n*m^2)

///空間複雜度:o(n^2)

網路流 最大流(Edmond Karp演算法)

一 含義 從源點到經過的所有路徑的最終到達匯點的所有流量和 例如 在這個圖中求源點1,到匯點4的最大流。答案為50,其中1 2 4為20 1 4為20 1 2 3 4為10 總和為20 20 10 50。二 ek演算法的核心 反覆尋找源點s到匯點t之間的增廣路徑,若有,找出增廣路徑上每一段 容量 流...

hdu4292Food(最大流Dinic演算法)

題意 每乙個人都有喜歡的吃的和喝的,每乙個人只選擇乙個數量的吃的和乙個數量的喝的,問能滿足最多的人數!思路 建圖很是重要!f food,p people,d drink 建圖 0 源點 f p p d t 匯點 將人拆分很是重要,因為每乙個人最多只能有一種選擇,也就是p p 的最大流量是 1!如果還...

hdu4292Food(最大流Dinic演算法)

題意 每乙個人都有喜歡的吃的和喝的,每乙個人只選擇乙個數量的吃的和乙個數量的喝的,問能滿足最多的人數!思路 建圖很是重要!f food,p people,d drink 建圖 0 源點 f p p d t 匯點 將人拆分很是重要,因為每乙個人最多只能有一種選擇,也就是p p 的最大流量是 1!如果還...