view docs/algorithm-edmonds-karp.pseudocode @ 123:4d96ace53ba1

Make it work on Python2 too with all tests by explicitely declaring some strings to be Unicode strings. No tests need to be skipped on Python2 now.
author Franz Glasner <fzglas.hg@dom66.de>
date Wed, 06 May 2026 15:53:24 +0200
parents 1c1985532139
children
line wrap: on
line source

// -*- coding: utf-8; indent-tabs-mode: nil -*-
\ALGORITHM{EdmondsKarp} \WITH
    \INPUT{
      \expr{graph}:  \expr{graph[v]} should be the list of edges coming out of vertex \expr{v} in the
              original graph and their corresponding constructed reverse edges
              which are used for push-back flow.
              Each edge should have a capacity \expr{cap}, \expr{flow}, source \expr{s} and sink \expr{t} 
              as parameters, as well as a pointer to the reverse edge \expr{rev}.
      \expr{s}:      Source vertex
      \expr{t}:      Sink vertex}
    \OUTPUT{
      \expr{flow}:  Value of maximum flow)}
\IS
    flow := 0
    \REPEAT
        /* Run a breadth-first search (bfs) to find the shortest s-t path.
           We use 'pred' to store the edge taken to get to each vertex,
           so we can recover the path afterwards. */
        q := queue()
        q.push(s)
        pred := array(graph.length)
        \WHILE not empty(q) and pred[t] = null \DO
            cur := q.pop()
            \FOR \text{Edge} e in graph[cur] \DO
                \IF pred[e.t] = null and e.t != s and e.cap > e.flow \THEN
                    pred[e.t] := e
                    q.push(e.t)
                \END IF
            \END FOR
        \END WHILE
        \IF not (pred[t] = null) \THEN
            /* We found an augmenting path.
               See how much flow we can send */
            df := 
            \FOR (e := pred[t]; e != null; e := pred[e.s]) \DO
                df := min(df, e.cap - e.flow)
            \END FOR
            /* And update edges by that amount */
            \FOR (e := pred[t]; e != null; e := pred[e.s]) \DO
                e.flow  := e.flow + df
                e.rev.flow := e.rev.flow - df
            \END FOR
            flow := flow + df
        \END IF
    \UNTIL pred[t] = null      \REM i.e., until no augmenting path was found
    \RETURN flow
\END ALGORITHM {EdmondsKarp}