Max-Flow Min-Cut Theorem

Imagine a water-supply network: pipes of fixed capacity connect a source reservoir to a destination city through a maze of junctions. A natural question is twofold. How much water can possibly flow from source to sink per unit time? Separately, consider an adversary who wants to shut off the supply entirely. If they sealed the fewest gallons-per-minute worth of pipes, how much sealing capacity would that take? These sound like different problems. One is a maximization over flow patterns. The other is a minimization over ways to disconnect the graph. The Max-Flow Min-Cut Theorem reveals that they are the same number. This equivalence is not a curiosity. It is the load-bearing wall of an enormous part of combinatorial optimization. It converts a max-flow computation into a certificate of optimality. Once you exhibit a flow and a cut of matching value, you know instantly that the flow is maximum. You also know, without further argument, that the cut is minimum. That certificate structure is what makes flow algorithms trustworthy building blocks. They are used in compilers, network reliability analysis, image segmentation, airline scheduling. Most famously, they appear in Bipartite Matching via Augmenting Paths. There, a maximum matching is extracted directly from a maximum flow. The theorem also explains why the Ford-Fulkerson Method terminates correctly. When no augmenting path exists in the residual graph, something important happens. The set of nodes still reachable from the source forms a cut. That cut's capacity exactly equals the current flow value. That reachability set is not a side observation. It is the proof. Understanding this connection changes how we see Ford-Fulkerson. It turns from "a greedy heuristic that happens to work" into something more. It becomes an algorithm with an ironclad termination and optimality argument. This article develops the theorem precisely. It covers what a flow network and an s-t cut are. It explains why flow value is always bounded above by cut capacity (weak duality). Then it presents the three-way characterization: maximum flow, no augmenting path, and minimum cut equality. Together these close the loop into a full "if and only if" statement. The article also includes a worked numerical trace. It also covers the classic pitfalls in applying it.

Key takeaways
  • An s-t cut partitions vertices into sets S∋sS \ni s and T∋tT \ni t; its capacity is the sum of capacities of edges crossing from SS to TT.
  • Weak duality: any flow's value is always ≤\le the capacity of any cut — flow is bounded above by every cut, always.
  • Strong duality (the theorem): the maximum flow value equals the minimum cut capacity — the bound is always achievable exactly.
  • Three-way equivalence: a flow ff is maximum   ⟺  \iff its residual graph has no augmenting path   ⟺  \iff some cut has capacity equal to ff's value.
  • The minimum cut is read off for free from the residual graph at termination: SS = vertices reachable from ss, TT = the rest.
  • This duality underlies correctness proofs for Ford-Fulkerson/Edmonds-Karp and powers reductions such as Bipartite Matching via Augmenting Paths and min-cut segmentation.
The core insight

The maximum amount of flow a network can carry from source to sink is exactly equal to the minimum total capacity of edges whose removal disconnects the source from the sink.

The idea

A flow network is a directed graph G=(V,E)G = (V, E) with a nonnegative capacity c(u,v)≥0c(u,v) \ge 0 on each edge, a source ss, and a sink tt (assume no edges enter ss or leave tt, without loss of generality). A flow is a function f:V×V→Rf : V \times V \to \mathbb{R} satisfying capacity constraints (0≤f(u,v)≤c(u,v)0 \le f(u,v) \le c(u,v)) and flow conservation (inflow equals outflow at every vertex except ss and tt). The value of a flow is the net flow leaving the source, ∣f∣=∑vf(s,v)−∑vf(v,s)|f| = \sum_v f(s,v) - \sum_v f(v,s). An s-t cut is a partition of VV into two sets SS and T=V∖ST = V \setminus S with s∈Ss \in S and t∈Tt \in T. The capacity of the cut is

c(S,T)=∑u∈S, v∈Tc(u,v),c(S,T) = \sum_{u \in S,\, v \in T} c(u,v),

summing capacities only in the direction from SS to TT — edges from TT back into SS do not count, even though they exist in the graph. This asymmetry is essential: a cut is meant to bound flow that must cross the boundary going "forward," and reverse-direction capacity does nothing to prevent that. The central claim connecting these two objects has two halves. Weak duality says every flow value is at most every cut capacity — this direction is a simple accounting argument and holds unconditionally. Strong duality, the Max-Flow Min-Cut Theorem proper, says that equality is always attainable: there exists some flow and some cut whose numbers coincide, and that common value is simultaneously the maximum flow and the minimum cut. The proof of strong duality is where the real content lives, and it comes packaged with a residual graph — the same structure used to run Ford-Fulkerson Method — which supplies both the augmenting-path termination condition and the minimum cut itself, in one stroke.

How it works

Weak duality, precisely

Claim. For any flow ff and any s-t cut (S,T)(S,T), ∣f∣≤c(S,T)|f| \le c(S,T).

Argument. By conservation, the flow value equals the net flow crossing the cut in either direction:

∣f∣=∑u∈S,v∈Tf(u,v)  −  ∑u∈S,v∈Tf(v,u).|f| = \sum_{u \in S, v \in T} f(u,v) \;-\; \sum_{u \in S, v \in T} f(v,u).

This holds because summing conservation at every vertex in SS telescopes internal-to-SS terms to zero, leaving exactly the boundary terms (a standard "flow across a cut" identity). Each term f(u,v)≤c(u,v)f(u,v) \le c(u,v), and each subtracted term is nonnegative, so

∣f∣  ≤  ∑u∈S,v∈Tc(u,v)  =  c(S,T).|f| \;\le\; \sum_{u \in S, v \in T} c(u,v) \;=\; c(S,T).

This holds for every flow and every cut, immediately giving: max⁡f∣f∣≤min⁡(S,T)c(S,T)\max_f |f| \le \min_{(S,T)} c(S,T). The theorem's content is that this inequality is actually equality.

The residual graph and augmenting paths

For a flow ff, the residual graph GfG_f has, for each edge (u,v)∈E(u,v) \in E, a forward residual edge with capacity cf(u,v)=c(u,v)−f(u,v)c_f(u,v) = c(u,v) - f(u,v) (if positive), and a backward residual edge (v,u)(v,u) with capacity cf(v,u)=f(u,v)c_f(v,u) = f(u,v) (if positive) representing the ability to cancel existing flow. An augmenting path is any s→ts \to t path in GfG_f using only positive-residual-capacity edges; pushing flow equal to the path's bottleneck capacity along it strictly increases ∣f∣|f|.

The three-way characterization

Theorem. Let ff be a flow in network GG. The following are equivalent: 1. ff is a maximum flow in GG. 2. The residual graph GfG_f contains no augmenting path from ss to tt. 3. ∣f∣=c(S,T)|f| = c(S,T) for some s-t cut (S,T)(S,T).

Proof sketch. (1) ⇒\Rightarrow (2). If an augmenting path existed, we could push additional flow along it and strictly increase ∣f∣|f|, contradicting maximality. (2) ⇒\Rightarrow (3). Suppose GfG_f has no augmenting path. Let SS be the set of vertices reachable from ss in GfG_f, and T=V∖ST = V \setminus S. Since there is no path to tt, t∈Tt \in T, so (S,T)(S,T) is a valid s-t cut. Now examine any edge (u,v)(u,v) with u∈Su \in S, v∈Tv \in T: since vv is unreachable from ss but uu is reachable, the residual edge (u,v)(u,v) cannot exist in GfG_f (else vv would be reachable too) — so cf(u,v)=0c_f(u,v) = 0, meaning f(u,v)=c(u,v)f(u,v) = c(u,v) (the forward edge is saturated). Symmetrically, for any edge (v,u)(v,u) with v∈T,u∈Sv \in T, u \in S, the residual backward edge (u,v)(u,v) cannot exist either, forcing f(v,u)=0f(v,u) = 0 (no flow enters SS from TT). Plugging both facts into the flow-across-a-cut identity:

∣f∣=∑u∈S,v∈Tf(u,v)−∑u∈S,v∈Tf(v,u)=∑u∈S,v∈Tc(u,v)−0=c(S,T).|f| = \sum_{u \in S, v \in T} f(u,v) - \sum_{u \in S, v \in T} f(v,u) = \sum_{u \in S, v \in T} c(u,v) - 0 = c(S,T).

(3) ⇒\Rightarrow (1). By weak duality, ∣f∣≤c(S,T)|f| \le c(S,T) for every cut, in particular this one, so ∣f∣≤c(S,T)|f| \le c(S,T). But we're given ∣f∣=c(S,T)|f| = c(S,T) exactly, and every other flow f′f' satisfies ∣f′∣≤c(S,T)=∣f∣|f'| \le c(S,T) = |f|. Hence ff is maximum. ■\blacksquare Chaining these three implications closes the cycle (1)⇒(2)⇒(3)⇒(1)(1) \Rightarrow (2) \Rightarrow (3) \Rightarrow (1), proving all three equivalent — and, as a byproduct, proving strong duality: the maximum flow value equals the capacity of the specific cut constructed in step (2), which must therefore be a minimum cut (any smaller cut would violate weak duality against this flow).

Algorithm: extracting flow and cut together

``` FORD-FULKERSON-WITH-CUT(G, s, t, c): for each edge (u, v) in G: f(u, v) <- 0 build residual graph G_f from f and c while there exists a path P from s to t in G_f (using edges with positive residual capacity): b <- min residual capacity along P // bottleneck for each edge (u, v) in P: if (u, v) is a forward edge in G: f(u, v) <- f(u, v) + b else // (u,v) is a backward residual edge, f(v, u) <- f(v, u) - b // meaning true edge is (v,u) update G_f accordingly // No augmenting path remains: extract the minimum cut for free S <- { v in V : v is reachable from s in G_f } // via BFS/DFS T <- V \ S return f, (S, T) ``` The loop is exactly Ford-Fulkerson; the only addition is the final reachability pass, which is what the proof of (2)⇒(3)(2) \Rightarrow (3) constructs explicitly. Running BFS instead of arbitrary path search gives Edmonds–Karp, with the same cut-extraction step appended unchanged.

Figure
A saturating cut discovered from the residual graph at termination
s a b c d t S (reachable from s) T 10/10 6/9 4/4 * 6/6 * 0/5 4/8 6/7 * = saturated edges crossing S→T; capacity 4+6+0 = 10 = |f| = min cut

Complexity & correctness

Correctness is exactly the three-way equivalence proved above: the algorithm halts precisely when no augmenting path exists, at which point condition (2) holds, forcing conditions (1) and (3) — the current flow is simultaneously maximum, and the reachable-set partition is simultaneously a minimum cut. No separate correctness argument is needed for "why does the cut we output actually have minimum capacity" — it falls out of the same reachability computation used to detect termination. This is the theorem's real payoff: optimality is self-certifying, not something requiring an external check against all other cuts.

Time complexity depends on the augmenting-path strategy layered on top of this framework, since the theorem itself is strategy-agnostic:

  • Generic Ford-Fulkerson (arbitrary augmenting path, integer capacities): each augmentation increases ∣f∣|f| by at least 11, so the loop runs at most ∣f∗∣|f^*| times (the max-flow value), each augmentation costing O(E)O(E) to find a path via BFS/DFS and O(V)O(V) to update it — total O(E⋅∣f∗∣)O(E \cdot |f^*|). This is pseudo-polynomial: with capacities in the billions, ∣f∗∣|f^*| can be astronomically larger than VV or EE, and a poorly chosen sequence of paths can genuinely realize this slowdown.
  • Edmonds–Karp (always augment along a shortest path, by edge count, found via BFS): guarantees O(VE)O(VE) augmentations, each costing O(E)O(E), for O(VE2)O(VE^2) total — genuinely polynomial, independent of capacity magnitudes.
  • The final cut-extraction step (one BFS/DFS over GfG_f) costs O(V+E)O(V+E) and is performed once, so it never dominates the asymptotic bound.

Space complexity is O(V+E)O(V + E): the residual graph mirrors the original graph's structure with at most a constant-factor blowup (one reverse edge per original edge), and the flow values themselves are stored per edge.

Honest tradeoffs. The theorem guarantees the existence of a matching flow/cut pair and gives a clean stopping condition, but says nothing about how fast you reach that state — that is entirely the job of the augmenting-path selection rule. The theorem also assumes finite capacities (or requires care with infinite-capacity edges) and, in its basic form, real- or integer-valued capacities; with irrational capacities and poorly chosen augmenting paths, Ford-Fulkerson can in principle fail to converge at all, though this pathology does not arise under Edmonds–Karp or with integer capacities. Finally, the minimum cut produced is a minimum cut — networks can have multiple cuts of equal minimum capacity, and the algorithm returns whichever one corresponds to the specific terminal residual graph reached.

Worked example

Consider a small network: source ss, sink tt, and intermediate vertices a,ba, b. Edges and capacities: s ⁣→ ⁣a:3s\!\to\!a: 3, s ⁣→ ⁣b:2s\!\to\!b: 2, a ⁣→ ⁣b:1a\!\to\!b: 1, a ⁣→ ⁣t:2a\!\to\!t: 2, b ⁣→ ⁣t:3b\!\to\!t: 3.

StepAugmenting path foundBottleneckFlow value afterResidual graph notes
0— (initial, f≡0f \equiv 0)—0all forward edges at full residual capacity
1s→a→ts \to a \to tmin⁡(3,2)=2\min(3,2) = 22s ⁣→ ⁣as\!\to\!a residual now 11; a ⁣→ ⁣ta\!\to\!t residual now 00 (saturated); backward edges a ⁣→ ⁣sa\!\to\!s (2), t ⁣→ ⁣at\!\to\!a (2) appear
2s→b→ts \to b \to tmin⁡(2,3)=2\min(2,3) = 24s ⁣→ ⁣bs\!\to\!b saturated; b ⁣→ ⁣tb\!\to\!t residual now 11; backward edges b ⁣→ ⁣sb\!\to\!s (2), t ⁣→ ⁣bt\!\to\!b (2) appear
3s→a→b→ts \to a \to b \to tmin⁡(1,1,1)=1\min(1,1,1) = 15s ⁣→ ⁣as\!\to\!a now saturated; a ⁣→ ⁣ba\!\to\!b saturated; b ⁣→ ⁣tb\!\to\!t now saturated
4search for augmenting path in GfG_fnone found5terminate

At termination, run BFS from ss in GfG_f. Remaining forward residual edges: none out of ss (both s ⁣→ ⁣as\!\to\!a and s ⁣→ ⁣bs\!\to\!b are saturated, residual 00); the only edges out of ss in GfG_f would be backward edges into ss, which don't count as outgoing. So S={s}S = \{s\} exactly — no vertex is reachable — and T={a,b,t}T = \{a, b, t\}. Compute the cut capacity c(S,T)c(S,T): sum capacities of edges from S={s}S=\{s\} to TT. These are s ⁣→ ⁣as\!\to\!a (capacity 3) and s ⁣→ ⁣bs\!\to\!b (capacity 2), giving

c(S,T)=3+2=5.c(S,T) = 3 + 2 = 5.

This matches ∣f∣=5|f| = 5 exactly, confirming via condition (3) that ff is maximum and (S,T)(S,T) is a minimum cut — no further search over other partitions is needed. Notice this is not the visually "obvious" bottleneck (one might have guessed the a ⁣→ ⁣ba\!\to\!b edge, capacity 11, matters more than it does); the theorem's certificate removes any doubt about which cut is truly binding.

Common pitfalls & traps

PitfallWhy it happensFix
Forgetting reverse residual edgesTreating residual graph as a simple copy of GG with reduced capacitiesAlways add a backward edge of capacity f(u,v)f(u,v) for every unit of flow sent — it lets the algorithm "undo" bad early choices
Summing capacity in both directions for a cutConfusing an undirected cut in general graphs with a directed s-t cutOnly count edges strictly from SS to TT; edges from TT to SS contribute zero to c(S,T)c(S,T)
Assuming any terminal residual graph gives the unique min cutMultiple minimum cuts can coexist when several bottlenecks tieState clearly that the algorithm returns a minimum cut, and note ties are possible
Using DFS/arbitrary paths and expecting polynomial time on huge capacitiesConfusing "terminates" with "terminates quickly" — pseudo-polynomial vs. polynomial boundsUse Edmonds–Karp (BFS shortest augmenting paths) or scaling algorithms for guaranteed polynomial behavior
Ignoring parallel edges or self-loops when building GfG_fNaive implementations overwrite residual capacities when merging edgesTrack capacities per directed edge pair carefully, or merge parallel edges into one with summed capacity before running

Pioneers & history

The theorem emerged from RAND Corporation research into Cold War-era logistics and transportation-network planning, where the practical question was literally about rail and pipeline capacities under adversarial interdiction.

Origins · 1 minLester Randolph Ford Jr. and how this was discovered
LR
Lester Randolph Ford Jr.
1927–2017 · American mathematician, co-developer of network flow theory at RAND

Ford, working with Delbert Fulkerson, formalized the flow network model and the augmenting-path method, publishing the algorithm that bears their names and, alongside it, the proof that maximum flow equals minimum cut — turning a military logistics question into one of the foundational theorems of combinatorial optimization.

History
1955
Theodore Harris and F.S. Ross model Soviet rail-network capacity as a flow problem for RAND, motivating the mathematics.
1956
L.R. Ford Jr. and D.R. Fulkerson publish the max-flow min-cut theorem and the augmenting-path (Ford-Fulkerson) method.
1970
Yefim Dinitz and, independently, Jack Edmonds with Richard Karp, give polynomial-time algorithms (blocking flows; shortest augmenting paths).
1972
Edmonds and Karp formally prove the O(VE2)O(VE^2) bound for shortest-augmenting-path Ford-Fulkerson.
1998
Andrew Goldberg and Satish Rao introduce length-function based algorithms pushing max-flow complexity further toward near-linear time.

Where this matters

Network reliability engineers use min-cut computations to find the cheapest set of links whose failure would partition a communication or power network — directly reporting the min-cut capacity as the "weakest link" bandwidth of the whole system. Compiler and hardware design tools use flow-based min-cut algorithms for register allocation and circuit partitioning, where the cut corresponds to wires or variables that must cross a physical or logical boundary. Computer vision systems use min-cut/max-flow formulations for image segmentation, treating pixel similarity as edge capacity and separating foreground from background via a minimum boundary cut. Airline and logistics scheduling systems model crew and aircraft assignment as flow problems, where max-flow answers "can this schedule be covered" and min-cut identifies the exact bottleneck resource. Most directly, the theorem is the correctness backbone for Bipartite Matching via Augmenting Paths: casting bipartite matching as a unit-capacity flow problem, the max-flow min-cut equivalence guarantees that the maximum matching size equals the flow value found by augmenting paths, with König's theorem on minimum vertex covers falling out as a direct corollary of the minimum cut structure.

Ask the tutor: How does the choice of augmenting path (arbitrary vs. shortest vs. max-bottleneck) affect which minimum cut the algorithm ultimately reports?

Is the minimum cut always unique?

No. Multiple distinct partitions (S,T)(S,T) can share the same minimum capacity, especially in networks with symmetric or repeated bottleneck structures. The algorithm described here returns one specific minimum cut — the one determined by reachability in the particular residual graph reached when augmenting paths run out. If a different sequence of augmenting paths were chosen, the algorithm could terminate at a different maximum flow (flow decompositions aren't always unique either) and hence potentially report a different, equally valid, minimum cut. Uniqueness of the value is guaranteed by the theorem; uniqueness of the partition is not.

Does the theorem require integer capacities?

No — the theorem holds for real-valued, nonnegative capacities in general. What integer capacities buy you is a clean termination and complexity argument for basic Ford-Fulkerson: since each augmentation increases the flow by an integer amount, and the maximum flow is bounded, the number of augmentations is finite and bounded by the max-flow value. With real-valued capacities and adversarial path choices, generic Ford-Fulkerson can, in pathological constructed examples, fail to converge to the optimum or converge arbitrarily slowly. Algorithms like Edmonds–Karp sidestep this entirely by choosing shortest augmenting paths, guaranteeing polynomial-time convergence regardless of whether capacities are integers or reals.

How does this theorem relate to linear programming duality?

Max-flow is naturally expressible as a linear program: maximize flow value subject to capacity and conservation constraints. Min-cut corresponds to the dual linear program of that formulation. The Max-Flow Min-Cut Theorem is then a special, combinatorially cleaner instance of the general LP Strong Duality Theorem, which states that a linear program's optimal value equals its dual's optimal value whenever both are feasible and bounded. What makes max-flow special is that the dual variables can be shown to correspond exactly to a 0/1 indicator of the cut partition, so the abstract LP duality gap collapses into a concrete graph-theoretic statement about disconnecting edges.

What happens if the network has directed cycles or multiple edges between the same pair of vertices?

The theorem and the algorithm both handle these gracefully with minor bookkeeping. Directed cycles cause no conceptual issue: conservation still holds at every vertex, and augmenting paths simply may pass through cycle vertices without using the cyclic edges unless useful. Parallel edges between the same ordered pair should be merged into a single edge with capacity equal to the sum (or tracked separately with care in the residual graph construction) to avoid double-counting or capacity-update bugs. Antiparallel edges — an edge u→vu\to v and a separate edge v→uv \to u — require slightly careful residual-graph bookkeeping since a naive implementation might conflate a "real" edge with the "residual" reverse edge of the opposite one; splitting each real edge with an intermediate vertex is a standard, safe fix.

Can the theorem fail if there are infinite-capacity edges, such as unlimited-bandwidth links?

As long as some finite s-t cut exists — that is, the max flow value is finite — the theorem still holds cleanly, and infinite-capacity edges simply never appear in the minimum cut (since including them would make the cut capacity infinite, never minimal). Problems only arise if every s-t cut has infinite capacity, meaning there's no way to disconnect ss from tt with finite total capacity; in that degenerate case, the maximum flow is unbounded (infinite), and "minimum cut" is not a meaningful finite quantity. Well-posed modeling should avoid this by ensuring at least one finite cut exists, which is true for any network where source out-capacity or sink in-capacity is itself bounded.

How is the theorem used to prove König's theorem for bipartite matching?

Casting bipartite matching as a flow problem — source connected to one side, sink from the other, unit capacities throughout — makes max-flow equal max-matching by the integrality of flow values on unit-capacity networks (each augmenting path corresponds to an alternating path augmenting the matching by exactly one edge). The minimum cut in this construction corresponds exactly to a minimum vertex cover: vertices whose separating edges are cut. Because max-flow equals min-cut by this theorem, maximum matching size equals minimum vertex cover size in bipartite graphs — precisely König's theorem, obtained as a direct corollary rather than requiring separate combinatorial proof. This is the seed idea developed fully in Bipartite Matching via Augmenting Paths.

Why is the reverse-direction capacity excluded from a cut's definition?

A cut is meant to model "how much flow-carrying capacity must be crossed to get water from ss's side to tt's side." Only forward-direction edges (from SS into TT) can carry flow that direction; an edge running the opposite way, from TT back into SS, contributes nothing to pushing flow toward tt and, if anything, could only carry flow the "wrong" way. Including it in the capacity sum would overstate how much interdiction is needed to fully disconnect ss from tt, breaking the tight equality with maximum flow — weak duality would still hold (the bound would just be looser and no longer achievable), but strong duality, the actual theorem, requires this precise, direction-sensitive definition.

Before this