Resources
The resources below include many clever applications of min cut, including the Closure Problem.
| Resources | |||||
|---|---|---|---|---|---|
| CPC | Slides from "Algorithm Design." Min-Cut Max-Flow Theorem, applications of flow / min cut. | ||||
Min-Cut Max-Flow Theorem
Given a flow network with source and sink , an - cut is a partition of the vertices into two sets and with and . Its capacity is the total capacity of the edges crossing from the source side to the sink side:
(Edges pointing the other way, from to , contribute nothing.) Cutting all of these edges disconnects from , so intuitively the capacity of a cut is an upper bound on how much flow can get from to . Indeed, for any flow and any cut ,
where is the total flow from to . So every flow is bounded by every cut.
![]()
Here is an illustration of a cut: red nodes are in , and blue nodes are in . Importantly, there is no need for and to be connected: the only requirement is that and . The capacity of this cut is the sum of the capacities underlined in green, . The flow across this cut derives from the numbers underlined in yellow, , which we note is equivalent to the actual flow, . Also note that in this instance, the flow across the cut () is less than its capacity (). However, if we instead choose and , the flow across the cut () and its capacity () will be equal.
The min-cut max-flow theorem states that in general, we can always achieve such equality:
The maximum value of an - flow equals the minimum capacity of an - cut.
To show tightness, we just need to construct a flow and cut such that . To do this, we will let be any maximum flow, then use the fact that cannot have any remaining augmenting paths to construct a minimum capacity cut. In fact, it turns out this cut can be constructed by letting be the set of nodes reachable from in the residual graph (and be the set of all other nodes, i.e. ). To see why this is the case, consider the following diagram:
![]()
By definition, the red edges must be saturated to capacity, otherwise nodes in would be able to reach nodes in . Similarly, the blue edges must have 0 flow. Therefore, the flow across this cut equals the capacity of this cut, as desired.
Minimum Node Covers
Focus Problem – try your best to solve this problem before continuing!
| Resources | |||||
|---|---|---|---|---|---|
| CPH | brief mentions of Hall's Theorem, Konig's Theorem | ||||
Solution - Coin Grid
This problem asks us to find a minimum node cover of a bipartite graph. Construct a flow graph with vertices labeled , source , sink , and the following edges:
- Edges from with capacity for each . Cutting the -th such edge corresponds to choosing the -th row.
- Edges from with capacity for each . Cutting the -th such edge corresponds to choosing the -th column.
- If there exists a coin in add an edge from with capacity .
First we find a max flow, which tells us the number of edges with capacity 1 we
need to cut. To find the min cut itself, BFS from the source once more time.
Edges connecting vertices that are reachable from the source
(lev[a] != -1) to vertices that aren't (lev[b] == -1) are part of the
minimum cut. In this case, each of these edges must be of the form or
for . Each cut edge corresponds to a row or column we
remove coins from.
Note that edges of the form can't be cut because they have capacity .
struct Dinic { // flow templateusing F = ll; // flow typestruct Edge {int to;F flo, cap;};int N;V<Edge> eds;V<vi> adj;void init(int _N) {
Minimum Path Covers
Focus Problem – try your best to solve this problem before continuing!
| Resources | |||||
|---|---|---|---|---|---|
| CPH | brief mentions of node-disjoint and general path covers, Dilworth's theorem | ||||
| Wikipedia | proof via Konig's theorem | ||||
Solution - The Wrath of Kahn
Ignore all vertices of that can never be part of . Then our goal is to find the size of a maximum antichain in the remaining graph, which as mentioned in CPH is just an instance of minimum path cover.
TopoSort<500> T;int n, m;bool link[500][500];vi out[500];Dinic<1005> D;int main() {setIO();re(n, m);F0R(i, m) {
Problems
| Status | Source | Problem Name | Difficulty | Tags | ||
|---|---|---|---|---|---|---|
| CSES | Easy | |||||
| Old Gold | Easy | Show TagsMax Flow | ||||
| CSA | Normal | |||||
| CF | Normal | |||||
| CF | Normal | |||||
| CF | Hard | |||||
| AC | Hard | |||||
| FHC | Hard | |||||
Module Progress:
Join the USACO Forum!
Stuck on a problem, or don't understand a module? Join the USACO Forum and get help from other competitive programmers!