关闭

Edmonds Karp 算法

标签: 最大流ek算法最短增广路径算法网络流
752人阅读 评论(0) 收藏 举报
分类:
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.\
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:47898次
    • 积分:880
    • 等级:
    • 排名:千里之外
    • 原创:36篇
    • 转载:9篇
    • 译文:1篇
    • 评论:3条
    文章分类
    最新评论