最大流 Ford Fulkerson方法

2021-10-19 02:38:13 字數 1897 閱讀 9010

ford-fulkerson方法的基本思想是,在每次迭代中,先在殘存網路中尋找乙個增廣路徑,然後將流按照增廣路徑增加即可,直到找不到增廣路徑為止。

偽**可以寫出:

ford-fulkerson(g,s,t)

for each edge(u,v) in g.e

(u,v).f = 0

while gf.p is not null

cf(p) = min(cf(u,v) : (u,v) in p)

for each edge(u,v) in p

if (u,v) in e

(u,v).f += cf(p)

else

(v,u).f -= cf(p)

演算法首先初始化流為零流,下面的while迴圈中,每一次迭代都先尋找一條增廣路徑,然後計算這個路徑的殘存容量,之後按照殘存容量調整流量即可,直到沒有增廣路徑位為止。

基本ford-fulkerson演算法的時間複雜度取決於如何尋找一條增廣路徑,通常我們使用的是深度優先搜尋或者廣度優先搜尋,均為多項式時間。

在基本ford-fulkerson演算法的基礎上,我們選擇廣度優先搜尋來尋找增廣路徑,並且這個增廣路徑的距離s→t

s \to t

s→t(把邊上的權值看成單位權值)是最小的,為δ(s

,t

)\delta(s,t)

δ(s,t)

。這種優化方法稱為edmonds-karp演算法

引理:如果edmonds-karp演算法執行在圖g中,對於任意節點u∈v

−u \in v- \

u∈v−

,殘存網路中的最短路徑δ(s

,u

)\delta(s,u)

δ(s,u)

隨著每次流量的遞增而單調遞增。

定理:如果edmonds-karp演算法執行在圖g中,流量遞增所執行的次數為o(v

e)

o(ve)

o(ve)。

所以,edmonds-karp演算法的時間複雜度為o(v

e2

)o(ve^)

o(ve2)

。p3376

#include

using

namespace std;

typedef

long

long ll;

ll capacity[

2000][

2000];

ll flow[

2000][

2000];

int pre[

2000];

ll bfs

(int n,

int s,

int t)

else

if(capacity[i]

[curr]!=0

&& flow[i]

[curr]

>0)

}}}return cfp[t];}

ll maxflow

(int n,

int s,

int t)

else

curr = pre[curr];}

ans +

= cfp;

}return ans;

}int

main()

else

if(capacity[v]

[u]!=0)

else

} cout <<

maxflow

(virtualv -

1, s, t)

<< endl;

}

模板 網路最大流 最大流

給出乙個網路圖,以及其源點和匯點,求出其網路最大流。in put role presentation inp utin put4 5 4 3 4 2 30 4 3 20 2 3 20 2 1 30 1 3 40ou tput role presentation out puto utpu t50最大...

模板 網路最大流 最大流

給出乙個網路圖,以及其源點和匯點,求出其網路最大流。in put role presentation inp utin put4 5 4 3 4 2 30 4 3 20 2 3 20 2 1 30 1 3 40ou tput role presentation out puto utpu t50最大...

網路最大流

1,一般增廣路演算法 採取標號法每次在容量網路中尋找一條增廣路進行增廣,直至不存在增廣路為止。增廣路方法 2,最短增廣路演算法 每個階段 在層次網路中,不斷用bfs演算法進行增廣直到 不存在增廣路為止。如果匯點不在層次網路中,則演算法中 止。3,連續最短增廣路演算法 在最短增廣路演算法的基礎上改造 ...