Content deleted Content added
Fixed a typo |
ce |
||
(22 intermediate revisions by 12 users not shown) | |||
Line 1:
{{Short description|Algorithm to compute the maximum flow in a flow network}}
{{Use American English|date = April 2019}}
In [[computer science]], the '''Edmonds–Karp algorithm''' is an implementation of the [[Ford–Fulkerson algorithm|Ford–Fulkerson method]] for computing the [[maximum flow problem|maximum flow]] in a [[flow network]] in [[big O notation|<math>O(|V||E|^2)</math>]] time. The algorithm was first published by [[Yefim Dinitz
{{Wikibooks|Algorithm implementation|Graphs/Maximum flow/Edmonds-Karp|Edmonds-Karp}} ==Algorithm==
The algorithm is identical to the [[Ford–Fulkerson algorithm]], except that the search order when finding the [[Flow network#Augmenting paths|augmenting path]] is defined. The path found must be a [[Shortest path problem|shortest path]] that has available capacity. This can be found by a [[breadth-first search]], where we apply a weight of 1 to each edge. The running time of <math>O(|V||E|^2)</math> is found by showing that each augmenting path can be found in <math>O(|E|)</math> time, that every time at least one of the
The proof first establishes that distance of the shortest path from the source node {{mvar|s}} to any non-sink node {{mvar|v}} in a residual flow network increases monotonically after each augmenting iteration (Lemma 1, proven below). Then, it shows that each of the <math>|E|</math> edges can be critical at most <math>\frac{|V|}{2}</math> times for the duration of the algorithm, giving an upper-bound of <math>O\left( \frac{|V||E|}{2} \right) \in O(|V||E|)</math> augmenting iterations. Since each iteration takes <math>O(|E|)</math> time (bounded by the time for finding the shortest path using Breadth-First-Search), the total running time of Edmonds-Karp is <math>O(|V||E|^2)</math> as required. <ref name='clrs'/>
To prove Lemma 1, one can use [[proof by contradiction]] by assuming that there is an augmenting iteration that causes the shortest path distance from {{mvar|s}} to {{mvar|v}} to ''decrease''. Let {{mvar|f}} be the flow before such an augmentation and <math>f'</math> be the flow after. Denote the minimum distance in a residual flow network {{tmath|G_f}} from nodes <math>u, v</math> as <math>\delta_f (u, v)</math>. One can derive a contradiction by showing that <math>\delta_f (s, v) \leq \delta _{f'} (s, v)</math>, meaning that the shortest path distance between source node {{mvar|s}} and non-sink node {{mvar|v}} did not in fact decrease. <ref name='clrs'/>
==Pseudocode==
Line 12 ⟶ 17:
'' original graph '''and''' their corresponding constructed reverse edges''
'' which are used for push-back flow.''
'' Each edge should have a capacity 'cap', flow, source 's' and sink
'' as parameters, as well as a pointer to the reverse edge 'rev'.)''
s ''(Source vertex)''
t ''(Sink vertex)''
Line 52 ⟶ 57:
Given a network of seven nodes, source A, sink G, and capacities as shown below:
[[Image:Edmonds-Karp flow example 0.svg|300px|class=skin-invert-image]]
In the pairs <math>f/c</math> written on the edges, <math>f</math> is the current flow, and <math>c</math> is the capacity. The residual capacity from <math>u</math> to <math>v</math> is <math>c_f(u,v)=c(u,v)-f(u,v)</math>, the total capacity, minus the flow that is already used. If the net flow from <math>u</math> to <math>v</math> is negative, it ''contributes'' to the residual capacity.
Line 58 ⟶ 63:
{| class="wikitable"
|-
! Capacity▼
! Path
▲! Capacity
! Resulting network
|-
| align="center" | <math>A,D,E,G</math>▼
| <math>\begin{align}
& \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
\end{align}</math>
| [[Image:Edmonds-Karp flow example 1.svg|300px|class=skin-invert-image]]</td>▼
▲|align="center"| <math>A,D,E,G</math>
▲| [[Image:Edmonds-Karp flow example 1.svg|300px]]</td>
|-
| align="center" | <math>A,D,F,G</math>▼
| <math>\begin{align}
& \min(c_f(A,D),c_f(D,F),c_f(F,G)) \\
Line 75 ⟶ 81:
= & \min(2,6,9) = 2
\end{align}</math>
| [[Image:Edmonds-Karp flow example 2.svg|300px|class=skin-invert-image]]</td>▼
▲|align="center"| <math>A,D,F,G</math>
▲| [[Image:Edmonds-Karp flow example 2.svg|300px]]</td>
|-
| align="center" | <math>A,B,C,D,F,G</math>▼
| <math>\begin{align}
& \min(c_f(A,B),c_f(B,C),c_f(C,D),c_f(D,F),c_f(F,G)) \\
Line 83 ⟶ 89:
= & \min(3,4,1,4,7) = 1
\end{align}</math>
| [[Image:Edmonds-Karp flow example 3.svg|300px|class=skin-invert-image]]</td>▼
▲|align="center"| <math>A,B,C,D,F,G</math>
▲| [[Image:Edmonds-Karp flow example 3.svg|300px]]</td>
|-
| align="center" | <math>A,B,C,E,D,F,G</math>▼
| <math>\begin{align}
& \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)) \\
Line 91 ⟶ 97:
= & \min(2,3,2,1,3,6) = 1
\end{align}</math>
| [[Image:Edmonds-Karp flow example 4.svg|300px|class=skin-invert-image]]</td>▼
▲|align="center"| <math>A,B,C,E,D,F,G</math>
▲| [[Image:Edmonds-Karp flow example 4.svg|300px]]</td>
|}
|