Chapter 111

Home

Ford-Fulkerson Max Flow

Maximum flow finds how much material can flow from source to sink through a network of edges with capacities. Ford-Fulkerson repeatedly finds an augmenting path in the residual graph and pushes flow through it.

Ford-Fulkerson (DFS-based)

C++ — Ford-Fulkerson

struct Edge { int v, rev; long long cap; };
vector> adj;
vector vis;

void add_edge(int u, int v, long long cap) {
    adj[u].push_back({v, (int)adj[v].size(), cap});
    adj[v].push_back({u, (int)adj[u].size() - 1, 0});  // reverse edge
}

long long dfs(int u, int t, long long f) {
    if (u == t) return f;
    vis[u] = true;
    for (auto& e : adj[u]) {
        if (!vis[e.v] && e.cap > 0) {
            long long pushed = dfs(e.v, t, min(f, e.cap));
            if (pushed > 0) {
                e.cap -= pushed;
                adj[e.v][e.rev].cap += pushed;
                return pushed;
            }
        }
    }
    return 0;
}

long long max_flow(int s, int t) {
    long long flow = 0;
    while (true) {
        vis.assign(adj.size(), false);
        long long pushed = dfs(s, t, LLONG_MAX);
        if (pushed == 0) break;
        flow += pushed;
    }
    return flow;
}

// O(F × E) where F is max flow — bad for large flows.
// Use Edmonds-Karp (BFS) or Dinic instead.

Key Takeaways