Edmonds Karp 算法

翻译 2013年12月03日 16:03:50
algorithm EdmondsKarp
    input:
        C[1..n, 1..n] (Capacity matrix)
        E[1..n, 1..?] (Neighbour lists)
        s             (Source)
        t             (Sink)
    output:
        f             (Value of maximum flow)
        F             (A matrix giving a legal flow with the maximum value)
    f := 0 (Initial flow is zero)
    F := array(1..n, 1..n) (Residual capacity from u to v is C[u,v] - F[u,v])
    forever
        m, P := BreadthFirstSearch(C, E, s, t, F)
        if m = 0
            break
        f := f + m
        (Backtrack search, and write flow)
        v := t
        while v ≠ s
            u := P[v]
            F[u,v] := F[u,v] + m
            F[v,u] := F[v,u] - m
            v := u
    return (f, F)

algorithm BreadthFirstSearch
    input:
        C, E, s, t, F
    output:
        M[t]          (Capacity of path found)
        P             (Parent table)
    P := array(1..n)
    for u in 1..n
        P[u] := -1
    P[s] := -2 (make sure source is not rediscovered) 
    M := array(1..n) (Capacity of found path to node)
    M[s] := ∞
    Q := queue()
    Q.push(s)
    while Q.size() > 0
        u := Q.pop()
        for v in E[u]
            (If there is available capacity, and v is not seen before in search)
            if C[u,v] - F[u,v] > 0 and P[v] = -1
                P[v] := u
                M[v] := min(M[u], C[u,v] - F[u,v])
                if v ≠ t
                    Q.push(v)
                else
                    return M[t], P
    return 0, P

Example[edit]

Given a network of seven nodes, source A, sink G, and capacities as shown below:

Edmonds-Karp flow example 0.svg

In the pairs f/c written on the edges, f is the current flow, and c is the capacity. The residual capacity from u to v is c_f(u,v)=c(u,v)-f(u,v), the total capacity, minus the flow that is already used. If the net flow from u to v is negative, it contributesto the residual capacity.

Capacity Path
Resulting network
\min(c_f(A,D),c_f(D,E),c_f(E,G)) =

\min(3-0,2-0,1-0) =
\min(3,2,1) = 1

A,D,E,G
Edmonds-Karp flow example 1.svg
\min(c_f(A,D),c_f(D,F),c_f(F,G)) =

\min(3-1,6-0,9-0) =
\min(2,6,9) = 2

A,D,F,G
Edmonds-Karp flow example 2.svg
\min(c_f(A,B),c_f(B,C),c_f(C,D),c_f(D,F),c_f(F,G)) =

\min(3-0,4-0,1-0,6-2,9-2) =
\min(3,4,1,4,7) = 1

A,B,C,D,F,G
Edmonds-Karp flow example 3.svg
\min(c_f(A,B),c_f(B,C),c_f(C,E),c_f(E,D),c_f(D,F),c_f(F,G)) =

\min(3-1,4-1,2-0,0-(-1),6-3,9-3) =
\min(2,3,2,1,3,6) = 1

A,B,C,E,D,F,G
Edmonds-Karp flow example 4.svg

Notice how the length of the augmenting path found by the algorithm (in red) never decreases. The paths found are the shortest possible. The flow found is equal to the capacity across the minimum cut in the graph separating the source and the sink. There is only one minimal cut in this graph, partitioning the nodes into the sets \{A,B,C,E\} and \{D,F,G\}, with the capacity

c(A,D)+c(C,D)+c(E,G)=3+1+1=5.\

相关文章推荐

Edmonds_Karp算法模版

  • 2010年03月25日 13:59
  • 12KB
  • 下载

最大流-Edmonds-Karp算法

#include #include using namespace std; const int maxn=205; const int inf=0x7fffffff; int r[maxn][max...

POJ 1273 Drainage Ditches (网络流最大流基础 Edmonds_Karp算法)

POJ 1273 Drainage Ditches (网络流基础 Edmonds_Karp算法)

Edmonds_Karp 算法 (转)

找了好久终于在这个牛这里找到为什么反向边要加回流量的原因了, 因为是初学教程,所以我会尽量避免繁杂的数学公式和证明。也尽量给出了较为完整的代码。 本文的目标群体是网络流的初学者,尤其是看了各种NB的教...

求最大流Ford-Fulkerson方法(Edmonds-Karp算法)

基本思路: 使用反平行边来模拟残存网络。 在残存网络中用广搜来寻找增广路径(用pre数组记录前驱结点)。 如找不到增广路径,已达到最大流,结束 如找到增广路径,最大流的增值为增广路径上的权值的最小值。...

最大流Edmonds-Karp算法实现文件C++

// graph.cpp -- implement file. // 2011-09-25-14.31 -- 2011-09-25-15.58 // 2011-09-25-18.16 -- 201...

POJ 1459 Power Network (网络流最大流基础 多源点多汇点 Edmonds_Karp算法)

POJ 1459 Power Network (网络流最大流基础 多源点多汇点 Edmonds_Karp算法)

网络流 最大流 Edmonds-Karp算法

Edmonds-Karp算法,复杂度O(VE^2)。思想就是找增广路,不断增加流量。在残量(每条边上流量和容量的差)图上找一条每个边权值都为正的路(可以通过BFS,比DFS效率高),这些边权值里的最小...
  • corncsd
  • corncsd
  • 2014年01月21日 17:20
  • 587

hdu 3549 Flow Problem(最大流模版题 Edmonds-Karp算法)

Flow Problem Time Limit: 5000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) T...
  • WEYuLi
  • WEYuLi
  • 2013年09月29日 16:30
  • 624

POJ 1273 最大流入门题 Edmonds_Karp算法

Edmonds_Karp算法步骤: 循环{ 初始化 寻找增广路 没有则退出 根据增广路,更新flow } #include #include #include #inc...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Edmonds Karp 算法
举报原因:
原因补充:

(最多只允许输入30个字)