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.