1. Introduction
In this tutorial, we’ll explore the Edmonds-Karp algorithm for finding the maximum flow in network graphs. It’s a variant of the Ford-Fulkerson method, where augmenting paths are identified using breadth-first search (BFS).
2. Definitions
In this section, we define the network flow-related notions required throughout our discussion. We assume we’re given a directed graph , where is the set of vertices, and is the set of edges of the graph. We also assume that the size of is and the size of is .
2.1. Network Graph
In the maximum flow problem, we are given a network graph, and we need to find the maximum flow that can go from a source vertex, , to a sink vertex, . A network graph is a directed graph where each edge is assigned a non-negative capacity. That is, there’s a non-negative capacity function defined on the edges of the graph: . satisfies the following conditions:
We also define a non-negative function of flow defined on the edges of : . also conforms to several conditions:
The last condition simply means that the edge capacities constrain the flow and can’t exceed them.
Finally, we assume doesn’t contain reverse edges. That is, if , then . The reverse edges are not allowed because they constructively appear in the residual graph to find the maximum flow. Actually, we can get an equivalent graph without reverse edges from the original graph with reverse edges by introducing new vertices:
We perform the transformation above for all the reverse edges in the graph.
2.2. Residual Graph
The residual graph, , of is defined in the following way: , where if in . Shortly, consists of the same vertices as , and any edge is present in if has the potential to conduct more flow. If for edge , , that means the edge’s capacity is fully used, and it can’t accept any more flow. Such an edge is absent in .
Additionally, we include reverse edges in . Reverse edges are absent in and may appear in while running the Ford-Fulkerson method. If edge currently conducts the flow of value , then we add edge to with residual capacity .
Finally, we define a positive function of residual capacities on the edges of : . is defined as:
- and
- and
2.3. Augmenting Paths
An augmenting path is any path from to in . They’re used by the algorithm to increase the flow from to gradually.
3. Edmonds-Karp Algorithm
3.1. Algorithm Demonstration
Assume we have a network graph shown below. The edge capacities are depicted as well:
Let’s show how the Edmonds-Karp algorithm works by finding the maximum flow on the graph step by step. Initially, we build , which fully matches as there’s no flow in yet. Below, we can see on the left and on the right. For the edges of , we depict the current flow on them followed by their capacity:
Next, we find the first shortest path from to using BFS. The path consists of three edges and is shown on below. The flow increases by 8 along the augmenting path. We parallelly change the flow across the edges of as the algorithm progresses:
As the flow changes, new reverse edges may appear in . Below, we can see new reverse edges, along with the second shortest path from to consisting of four edges. The flow increases by 5 this time:
Next, we find another augmenting path consisting of four edges. The path increases the flow by 2:
We’re in a situation now where there’re no augmenting paths left in . It’s the indication that the algorithm has finished and we’ve found the maximum flow from to :
The maximum flow value may be fetched by either adding the flows on the outgoing edges of or by adding the flows on the incoming edge of . In either case, the maximum flow value is 15 for our example.
3.2. Algorithm Pseudocode
The pseudocode of the Edmonds-Karp algorithm is almost the same as the one for the Ford-Fulkerson method. The difference is that the Ford-Fulkerson method doesn’t specify how augmenting paths are found, while the Edmonds-Karp algorithm states they’re found using BFS. We can find the pseudocode of the Edmonds-Karp algorithm below:
algorithm EdmondsKarp(G, S, T):
// INPUT
// G = the graph
// S = the source vertex
// T = the sink vertex
// OUTPUT
// the maximum flow is found and returned
// Build G_R
Build G_R
while there is an augmenting path p found by BFS(G_R):
cmin <- infinity
for (u, v) in p:
if C_R(u, v) < cmin:
cmin <- C_R(u, v)
for (u, v) in p:
if (u, v) in E:
F(u, v) <- F(u, v) + cmin
else:
F(v, u) <- F(v, u) - cmin
if (v, u) not in E_R:
Add (v, u) to E_R
C_R(v, u) <- 0
C_R(u, v) <- C_R(u, v) - cmin
C_R(v, u) <- C_R(v, u) + cmin
if C_R(u, v) = 0:
Remove (u, v) from E_R
fmax <- 0
for (u, T) in E:
fmax <- fmax + F(u, T)
return fmax
3.3. Algorithm Complexity
The drawback of the Ford-Fulkerson method is that it may run in exponential time. Its time complexity is , where is the value of the maximum flow. So, the method’s time complexity depends on the maximum flow value. It effectively means that we may have various performances by changing the capacity function on the same graph. Additionally, the Ford-Fulkerson method may never end if the capacities of the edges are irrational.
The Edmonds-Karp algorithm fixes the drawbacks as it runs in polynomial time: . The complexity follows from the observation that there can’t be more than flow augmentations, and each flow augmentation runs in .
4. Conclusion
In this tutorial, we’ve discussed the Edmonds-Karp algorithm for finding the maximum flow in network graphs. It’s a customization of the Ford-Fulkerson method where augmenting paths are found using BFS. The algorithm is polynomial.