Ford-Fulkerson idea
Repeatedly find augmenting path (with capacity) in residual graph. Push flow. Repeat.
Advertisement
Edmonds-Karp = BFS variant
int maxFlow(int source, int sink) {
int flow = 0;
int[][] residual = capacity.clone();
while (true) {
int[] parent = new int[n];
Arrays.fill(parent, -1);
parent[source] = source;
Queue q = new LinkedList<>(); q.offer(source);
while (!q.isEmpty() && parent[sink] == -1) {
int u = q.poll();
for (int v = 0; v < n; v++)
if (parent[v] == -1 && residual[u][v] > 0) {
parent[v] = u; q.offer(v);
}
}
if (parent[sink] == -1) break;
int pathFlow = INF;
for (int v = sink; v != source; v = parent[v])
pathFlow = min(pathFlow, residual[parent[v]][v]);
for (int v = sink; v != source; v = parent[v]) {
residual[parent[v]][v] -= pathFlow;
residual[v][parent[v]] += pathFlow;
}
flow += pathFlow;
}
return flow;
} Advertisement
Residual graph
Forward edge = remaining capacity. Reverse edge = pushed flow (can be undone). Enables re-routing.
Complexity
Ford-Fulkerson: O(E × max_flow). Edmonds-Karp (BFS): O(V × E²). Dinic's: O(V² × E). Faster variants exist.