In computer science and graph theory, the Edmonds-Karp algorithm is an implementation of the Ford-Fulkerson method for computing the maximum flow in a flow network in . It is asymptotically slower than the relabel-to-front algorithm, which runs in , but it is often faster in practice for sparse graphs. The algorithm was first published by a Russian scientist, Dinic, in 1970 [cite journal | last = E. A. Dinic | title = Algorithm for solution of a problem of maximum flow in a network with power estimation | journal = Soviet Math. Doklady | volume = Vol 11 | issue = | pages = 1277–1280 | publisher = Doklady | date = 1970 | url = | doi = | id = | accessdate = ] , and independently by Jack Edmonds and Richard Karp in 1972 [cite journal | author = Jack Edmonds and Richard M. Karp | title = Theoretical improvements in algorithmic efficiency for network flow problems | journal = Journal of the ACM | volume = 19 | issue = 2 | pages = 248–264 | publisher = | date = 1972 | url = http://www.akira.ruc.dk/~keld/teaching/algoritmedesign_f03/Artikler/08/Edmonds72.pdf | doi = | id = | accessdate = ] (discovered earlier). Dinic's algorithm includes additional techniques that reduce the running time to .
Algorithm
The algorithm is identical to the Ford-Fulkerson algorithm,except that the search order when finding the augmenting path isdefined. The path found must be the shortest path which hasavailable capacity. This can be found by a breadth-first search, as we let edges have unit length. The running time of is found by showing that each augmenting pathcan be found in time, that every time at least one of the edge becomes saturated, that the distance from thesaturated edge to the source along the augmenting path must belonger than last time it was saturated, and that the distance isat most long. Another property of this algorithm isthat the length of the shortest augmenting path increasesmonotonically. There is an accessible proof in [cite book author = Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest and Clifford Stein | title = Introduction to Algorithms | publisher = MIT Press and McGraw-Hill | year = 2001 id = ISBN 0-262-53196-8 | edition = second edition | chapter =26.2 | pages = 660-663 ] .
Pseudocode
:"For a more high level description, see Ford-Fulkerson algorithm.
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) 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 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) elsereturn M [t] , P return 0, P
Example
Given a network of seven nodes, source A, sink G, and capacities as shown below:
In the pairs written on the edges, is the current flow, and is the capacity. The residual capacity from to is , the total capacity, minus the flow that is already used. If the net flow from to is negative, it "contributes" to the residual capacity.
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 and , with the capacity .
Java Implementation
import java.io.*; class FlowGraph{ public static final int WHITE = 0, GRAY = 1, BLACK = 2; private double [] [] flow, capacity, res_capacity; private int [] parent, color, queue; private double [] min_capacity; private int size, source, sink, first, last; private double max_flow;
public FlowGraph(String fileName) { .. // Read "size" value, "capacity [size] [size] " matrix, // as well as "source" and "sink" node indexes (0-based) // from an input text file. maxFlow(); }
private void maxFlow() // Edmonds-Karp algorithm with O(V³E) complexity { flow = new double [size] [size] ; res_capacity = new double [size] [size] ; parent = new int [size] ; min_capacity = new double [size] ; color = new int [size] ; queue = new int [size] ; for (int i = 0; i < size; i++) for (int j = 0; j < size; j++) res_capacity [i] [j] = capacity [i] [j] ; while (BFS(source)) { max_flow += min_capacity [sink] ; int v = sink, u; while (v != source) { u = parent [v] ; flow [u] [v] += min_capacity [sink] ; flow [v] [u] -= min_capacity [sink] ; res_capacity [u] [v] -= min_capacity [sink] ; res_capacity [v] [u] += min_capacity [sink] ; v = u; } } }
private boolean BFS(int source) // Breadth First Search in O(V²) { for (int i = 0; i < size; i++) { color [i] = WHITE; min_capacity [i] = Double.MAX_VALUE; } first = last = 0; queue [last++] = source; color [source] = GRAY; while (first != last) // While "queue" not empty.. { int v = queue [first++] ; for (int u = 0; u < size; u++) if (color [u] = WHITE && res_capacity [v] [u] > 0) { min_capacity [u] = Math.min(min_capacity [v] , res_capacity [v] [u] ); parent [u] = v; color [u] = GRAY; if (u = sink) return true; queue [last++] = u; } } return false; }
public void toFile(String fileName) { .. // Write the results ("flow" matrix and "max_flow" value) to output file. // To be called in the "main()" method.
References
# Algorithms and Complexity (see pages 63 - 69). http://www.cis.upenn.edu/~wilf/AlgComp3.html
Hopcroft–Karp algorithm — The Hopcroft–Karp algorithm finds maximum cardinality matchings in bipartite graphs in O(sqrt{V} E) time, where V is the number of vertices and E is the number of edges of the graph. [John E. Hopcroft, Richard M. Karp: An n^{5/2} Algorithm for… … Wikipedia
Richard Karp — Infobox Scientist name = Richard Manning Karp image width = caption = birth date = January 3, 1935 birth place = Boston, Massachusetts death date = death place = residence = citizenship = nationality = American ethnicity = field = Computer… … Wikipedia
Ford-Fulkerson algorithm — The Ford Fulkerson algorithm (named for L. R. Ford, Jr. and D. R. Fulkerson) computes the maximum flow in a flow network. It was published in 1956. The name Ford Fulkerson is often also used for the Edmonds Karp algorithm, which is a… … Wikipedia
Dinic's algorithm — is a strongly polynomial algorithm for computing the maximum flow in a flow network, conceived in 1970 by Israeli (formerly Soviet) computer scientist Yefim Dinitz. The algorithm runs in O(V2E) time and is similar to the Edmonds–Karp algorithm,… … Wikipedia
Push-relabel maximum flow algorithm — The push relabel algorithm is one of the most efficient algorithms to compute a maximum flow. The general algorithm has O(V^2 E) time complexity, while the implementation with FIFO vertex selection rule has O(V^3) running time, the highest active … Wikipedia
Jack Edmonds — Jack R. Edmonds is a mathematician, regarded as one of the most important contributors to the field of combinatorial optimization. He was the recipient of the 1985 John von Neumann Theory Prize.From 1969 on, with the exception of 1991 1993, he… … Wikipedia
Criss-cross algorithm — This article is about an algorithm for mathematical optimization. For the naming of chemicals, see crisscross method. The criss cross algorithm visits all 8 corners of the Klee–Minty cube in the worst case. It visits 3 additional… … Wikipedia
Levenberg–Marquardt algorithm — In mathematics and computing, the Levenberg–Marquardt algorithm (LMA)[1] provides a numerical solution to the problem of minimizing a function, generally nonlinear, over a space of parameters of the function. These minimization problems arise… … Wikipedia
Gauss–Newton algorithm — The Gauss–Newton algorithm is a method used to solve non linear least squares problems. It can be seen as a modification of Newton s method for finding a minimum of a function. Unlike Newton s method, the Gauss–Newton algorithm can only be used… … Wikipedia
Hungarian algorithm — The Hungarian method is a combinatorial optimization algorithm which solves the assignment problem in polynomial time and which anticipated later primal dual methods. It was developed and published by Harold Kuhn in 1955, who gave the name… … Wikipedia