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,連續最短增廣路演算法 在最短增廣路演算法的基礎上改造 ...