Maximum Flow

Widely used in algorithms on graphs.

Problem

Send something from a place to another over some networks, e.g. information, package, oil.

Each edge has capacity limit.

Input

directed graph \(G=(V,E)\), capacities \(c(e)\ge 0\), source vertex \(s\in V\), destination vertex \(t \in V\).

Goal

find the maximum volume flowing from \(s\) to \(t\) subject to the capacity constraint.

Analysis

Assume

  • all capacities are integers (capacity is a finite number. if not integer, scale.)

  • no edges enter \(s\) or leave \(t\) (makes no sense to use those edges)

  • call all edges entering \(v\) by \(\delta ^- (v)\)

  • call all edges leaving \(v\) by \(\delta ^+ (v)\)

Definition (Flow)

A function \(f:E \rightarrow \mathbb{R}\) which assign a value \(f(e)\) to every edge \(e \in E\), subject to

  • capacity constraints: edge flow less than edge capacity

    \[\forall e: \quad 0\le f(e) \le c(e)\]
  • flow conservation constraint: in-flow = out-flow for all intermediate nodes.

    \[\forall v \in V \backslash \left\{ s,t \right\}: \quad \sum_ {e\in \delta^- (v)} f(e) = \sum_ {e\in \delta^+ (v)} f(e) \quad\]

    or

    \[f^{\text{in}}(v) = f^{\text{out}}(v)\]
Definition (Value of flow)

The value of a flow is the amount of out-flow from source node \(s\) (assuming no in-flow to \(s\)).

\[ \operatorname{val}(f) = f^{\text{out}}(s) = \sum_ {e\in \delta^+ (s)} f(e) \]
Observation (Flow cancelation operation on anti-parallel edges)

For two anti-parallel edges \(e = (u,v)\) and \(e ^\prime = (v,u)\). Suppose \(f(e), f(e ^\prime ) >0\).

Let \(\Delta = \min \left\{ f(e), f(e ^\prime ) \right\}\) and assign new flow

\[\begin{split} f ^\prime (e) = f(e) - \Delta \\ f ^\prime (e ^\prime ) = f(e ^\prime ) - \Delta \end{split}\]

Then the new flow \(f ^\prime\) is still a feasible flow with the same value of flow \(f\).

\[ \operatorname{val}(f ^\prime ) = \operatorname{val}(f) \]

Algorithm

Algorithm

We first make an additional assumption and define residual flow networks.

Assumption (No anti-parallel edges)

Input \(G\) has no anti-parallel edges. If there is, say \(e = (u,v)\) and \(e ^\prime = (v,u)\), then add a node \(x\) in-between \(e = (u,v)\) and the new edges have the same capacity \(c(u,x) = c(x,v) = c(u,v)\).

Definition (Residual Flow Network)

Given a graph \(G\) and a feasible flow \(f\) in \(G\), let \(G_f\) be a new graph with the same vertices but new edges.

  • For every \(e(u,v) \in G\), add edges and assign capacity (called residual capacity)

    • add a forward edge to reflect unused capacity of \(e\)

      \[ c_f (u,v) = c(e) - f(e) \]
    • add a backward edge \((v,u)\) to reflect used capacity

      \[ c_f (v,u) = f(e) \]
  • For every edge \(e ^\prime\) in \(G_f\) with zero residual capacity \(c_f (e ^\prime ) = 0\), delete.

Fig. 35 Three kinds of edge in \(G\) [Chuzhoy 2021]

Ford-Fulkerson algorithm is an iterative algorithm. In each iteration, we compute the residual floe network of the current graph and use that to improve the original graph. Note that flow \(f()\) only exists in the original graph.


Ford-Fulkerson’s algorithm


  • Start:

    • For all edge \(e \in E(G)\), initialize zero flow \(f(e)=0\).

    • Compute the residual flow network \(G_f\). For every \(e(u,v) \in G\), add edges and assign capacity (called residual capacity)

      • add a forward edge to reflect unused capacity of \(e\)

        \[ c_f (u,v) = c(e) - f(e) \]
      • add a backward edge \((v,u)\) to reflect used capacity

        \[ c_f (v,u) = f(e) \]
      • delete edges with zero residual capacity

  • While \(\exists\) a simple path \(s\)-\(t\) path \(P\) in the residual flow network \(G_f\), we “push” flow along this path (aka augmenting path).

    • Compute the smallest residual capacity along that path

      \[\Delta \leftarrow \min _{e \in E(P)} \left\{ c_f(e) \right\}\]
    • For each edge \(e=(u,v) \in P\), check whether it is a forward edge or a backward edge w.r.t. the original graph.

      • If \(e=(u,v)\) is a forward edge, then \((u,v) \in G\), and we increase the flow of that edge by \(\Delta\),

        \[f(u,v)\leftarrow f(u,v) + \Delta\]
      • Else, \(e=(u,v)\) is a backward edge, then \((v,u) \in G\), and we decrease the flow of \((v,u)\) by \(\Delta\),

        \[f(v,u) \leftarrow f(v,u) - \Delta\]
    • Re-compute \(G_f\).


Feasibility

Claim (Stops in finit time)

The FF algorithm stops after at most \(\sum_{v\in \operatorname{succ}(s)} c(s, v)\) iterations.

Claim 2 (Always a valid flow)

Flow \(f\) always remains a valid flow. That is, the flow always satisfies the capacity constraints and the conservation constraints.

Therefore, we show that after an iteration is completed, the constraints remain to be satisfied, so the feasibility is guaranteed.

Optimality

To prove optimality of the FF algorithm, we first introduce some definitions.

Recall the definition of in-flow to and out-flow from a node \(v\)

\[\begin{split} f^{\text{in}}(v) = \sum_{e \in \delta^{-}(v)} f(e) \\ f^{\text{out}}(v) =\sum_{e \in \delta^{+}(v)} f(e) \end{split}\]

We define similar quantities for a set of vertices.

Definition (In- and out-flow of a set of vertices)

For a set of vertices \(S \subseteq V\), ,

\[\begin{split}\begin{aligned} f^{\text{in}}(S) &= \sum_{u\notin S, v \in S} f(u, v) \\ f^{\text{out}}(S) &= \sum_{u\in S, v \notin S} f(u, v) \end{aligned}\end{split}\]
Definition (\(s\)-\(t\) cut)

An \(s\)-\(t\) cut \((A,B)\) is a cut in \(G\) such that the source node \(s\in A\) and the destination node \(t\in B\). The in- and out-flow of \(A\) and \(B\) have the relations

\[\begin{split}\begin{aligned} f^{\text{in}}(A) &= f^{\text{out}}(B) \\ f^{\text{out}}(A) &= f^{\text{in}}(B) \end{aligned}\end{split}\]
Definition (Capacity of an \(s\)-\(t\) cut)

The capacity of an \(s\)-\(t\) cut \((A,B)\) is defined as the sum of capacities of the edges from \(A\) to \(B\)

\[ c(A,B) = \sum _{u\in A, v \in B} c(u, v) \]
Property (Compute flow value from a cut)

Let \(f\) be any flow in \(G\), recall that the definition of flow value \(\operatorname{val}(f)=f^{\text{out}}(s)\). For any \(s\)-\(t\) cut \(c(A,B)\) in \(G\), the value of the flow \(f\) can be computed as

\[ \operatorname{val}(f) = f^{\text{out}}(A) - f^{\text{in}}(A) \]
Corollary

\(\operatorname{val}(f) \le c(A,B)\), with equality iff \(f^{\text{in}}(A) = 0\) and \(f^{\text{out}}(A) = c(A,B)\).

Theorem

If \(f\) is any \(s\)-\(t\) flow and \((A,B)\) is any \(s\)-\(t\) cut, and \(\operatorname{val}(f) = c(A,B)\), then \(f\) is a maximum flow, by Corollary.

How about existence?

Claim (Optimality)

If \(f\) is the flow returned by FF algorithm, then there exists an \(s\)-\(t\) cut \((A,B)\) such that \(\operatorname{val}(f) = c(A,B)\). So \(f\) is optimal by the above theorem.

Complexity

Let \(m\) be the number of edges in the graph \(G\).

Recall that there are at most \(\sum_{v\in \operatorname{succ}(s)} c(s, v)\) iterations. The bound is upper bounded by \(n \times c _{\max}(e)\).

In each iteration

  • Finding augmenting path \(P\) takes \(O(m)\)

  • Pushing flow along \(P\) takes \(O(m)\)

  • Recompute \(G_f\) takes \(O(m)\)

So the total running time is \(O(m\cdot n\cdot c _{\max})\)

Is FF algorithm efficient?

There are two inputs.

  • Graph, which is a combinatorial part of size \((n,m)\)

  • Capacities, which is a numerical part of size \(m\)

Recall different running time

  • strong-polynomial time: \(Poly(\text{input size of the combinatorial part})\), e.g. \(O(n)\)

  • weak-polynomial time: \(Poly(\text{input sizes of both parts})\), e.g. \(O(n \log c_\max)\)

  • pseudo-polynomial time: \(Poly(\text{the largest integer present in the input})\), e.g. \(O(c_\max)\)

Improvement: Edmonds-Karp Algorithm

Instead of using an arbitrary augmenting path, we use the shortest path \(s\)-\(t\) in \(G\) that minimizes number of edges. This work takes \(O(m)\) by BFS or DFS, so each iteration still takes \(O(m)\). But it reduces the number of iterations from \(O(nc_\max)\) to \(O(nm)\), this leads to the Edmonds-Karp algorithm with complexity \(O(nm^2)\).

To show that, we first run that algorithm, record the length of the chosen shortest path in each iteration, and then partition these the execution into phases, where each phase lasts as long as the lengths of augmenting paths chosen remains the same.

\[\begin{split}\begin{aligned} \text{iteration} &\quad 1 \quad2 \ \quad 3 \ \quad4 \ \quad 5 \quad6 \quad 7\\ \text{shortest path length} &\quad \underbrace{2 \quad 2}_{\text{phase 1} } \quad \underbrace{3\quad 3}_{\text{phase 2} } \quad \underbrace{5 \quad 5 \quad 5}_{\text{phase 3} } \\ \end{aligned}\end{split}\]
Claim (Non-decreasing shortest path length)

From iteration to iteration, the length of the augmenting path is non-decreasing. Hence, the number of phases is at most \(n\).

Claim (\(O(m)\) iterations in each phase)

Every phase covers at most \(O(m)\) iterations.

Approximation

\((1+\epsilon)\)-approximation returns a flow of value at least \(\frac{OPT}{1+\epsilon}\).

Other Properties

Theorem (Integrality of flow)

If all capacities are integrals, then the Ford-Fulkerson algorithm finds a maximum flow where \(f(e)\) is integral for all \(e\).

Minimum Cut

Problem

Input

  • A directed graph \(G=(V,E)\).

  • Capacity \(c(e)\).

  • Two special vertices \(s\) and \(t\).

Goal

Find an \(s\)-\(t\) cut \((A,B)\) where \(s \in A, t \in B\), with minimal cut capacity \(c(A,B)\), which is the sum of capacities of edge from \(A\) to \(B\), \(c(A, B) = \sum_{u\in A, v\in B} c(u,v)\).

In other words, we want to remove some edges to disconnect \(s\) and \(t\), and minimize the total capacities of these removed edges. The vertex partition’s perspective and edge removal’s perspective are equivalent.

Analysis

Theorem (Equivalency of maximum flow and minimum cut)

In any flow network \(G\), the value of a maximum \(s\)-\(t\) flow is equal to the capacity of a minimum \(s\)-\(t\) cut.

The proof is simply from the Corollary.

Thus, FF algorithm also gives an algorithm for finding a minimum \(s\)-\(t\) cut: after the algorithm stops, in the residual graph \(G_f\), find the set of vertices reachable from \(s\), then \((A, V\setminus B)\) is a minimum \(s\)-\(t\) cut.

Extension

\(O(m n c_\max)\) is not efficient. There are alternative algorithms to improve this.

Max-flow and Min-cut in Undirected Graphs

To find maximum \(s-t\) flow in undirected graph with capacities \(c(e)>0\), we can make the graph directed, and run Ford-Fulkerson algorithm on the directed counterpart.

  • Convert every undirected edge to two anti-parallel directed edges with the same capacity as the undirected edge.

    \[u - v \quad \Rightarrow \quad u \leftrightarrows v\]
  • Run the Ford-Fulkerson algorithm for directed graph.

  • Finally, run flow cancelation for two anti-parallel edges, such that one of the two anti-parallel edges is reduced to 0.

    \[u \leftrightarrows v \quad \Rightarrow \quad u \rightarrow v \text{ or } u \leftarrow v\]

The direction of an edge indicates the direction of flow (e.g. pipeline) in the undirected graph. The final flow value are the same, and the integrality of max-flow also holds.

Meanwhile, we can find a minimum cut on a undirected graph, the capacity/cost of the cut is the sum of the capacities of the edges across \(A\) and \(B\).

\[ \sum _{e \in E(A,B)} c(e) \]

Likewise, we convert every undirected edge to two anti-parallel directed edges, run Ford-Fulkerson algorithm to find a \(s\)-\(t\) cut \((A,B)\). The cut values are the same.

Since in the directed graph we have max-flow \(=\) min-cut, in the undirected graph we have max-flow \(=\) min-cut.

Minimum Cost Flow

Input: a directed graph \(G=(V,E)\), vertices \(s, t \in V\), capacities \(c(e)\) and weights \(w(e)\).

Goal: send maximum amount of flow from \(s\) to \(t\) in \(G\), with minimum possible cost, where for each edge \(e\), we need to pay \(w(e)\) for every unit of flow sent over edge \(e\).

Solution: First find the value \(d\) of an \(s\)-\(t\) max-flow in \(G\) (using Ford-Fulkerson algorithm or LP). Then solve the following LP. The variables are \(f(e)\)

\[\begin{split}\begin{aligned} \operatorname{minimize} && \sum_{e \in E} w(e) f(e) & &&\\ \mathrm{s.t.} && f(e) &\leq c(e) && \forall e \in E \\ && \sum_{e \in \delta^{+}(v)} f(e)-\sum_{e \in \delta^{-}(v)} f(e)&=0 && \forall v \in V \backslash\{s, t\} \\ &&\sum_{e \in \delta^{+}(s)} f(e)& =d && \\ && f(e) &\geq 0 && \forall e \in E \end{aligned}\end{split}\]

Can you solve the problem by solving a single LP (instead of first computing the value \(d\) and then solving an LP that depends on the value \(d\))??

\(s\)-\(t\) Shortest Path

Path-based Flow

Recall the flow \(f: V\rightarrow \mathbb{R} _{\ge 0}\) is defined for edges. We can consider a path-based flow \(f_{p} : \mathcal{P}\rightarrow \mathbb{R} _{\ge 0}\), where \(\mathcal{P}\) is the set of some \(s\)-\(t\) paths. Let \(f _{p} (P)\) be the flow of a path \(P \in \mathcal{P}\). It is valid if the edge capacity constraint holds.

\[ \forall e:\quad \sum_{P: P \in \mathcal{P} \text{ and } E(P) \ni e} f _{p} (P) \le c(e) \]

The set \(\mathcal{P}\) and the flow assignment \(f_p\) together are called a flow-paths solution, with value \(\sum_{P \in \mathcal{P}}f _{p} (P)\).

Theorem (Equivalence of edge-flow and path-flow)

Given an edge-based flow \(\left\{ f(e) \right\}_{e \in E}\), we can compute the path-based flow \(\left\{ f _{p} (P) \right\}_{P \in \mathcal{P}}\) efficiently, and

  • They have the same flow values \(\sum_{e \in \delta^+(s)} f(e)=\sum_{P \in \mathcal{P}}f _{p} (P)\)

  • If \(f\) is feasible, then , and \(f _{p}\) is also feasible.

  • If \(f\) is integral, then \(f _{p}\) is also integral.

And the reverse also hold.

Theorem (Flow decomposition)

Any \(s\)-\(t\) flow can decompose into at most \(m\) number of cycles and \(s\)-\(t\) paths.

Note that dropping the cycles does not affect the flow value. Thus, the paths obtained from this algorithm together with their \(\Delta\) form a valid flow-paths solution, which means we can solve path-based max-flow by solving edge-based max-flow, and then converting it. The original path-based flow has exponential number of variables and constraints in \(n\), but it can be solved by the Ellipsoid Algorithm together with a separation oracle.

\[\begin{split} \begin{array}{rcc} \operatorname{maximize} & \sum_{P \in \mathcal{P}} f_p(P) & \\ \text { s.t. } & \sum_{P: e \in P} f_p(P) \leq c(e) & \forall e \in E \\ & f_p(P) \geq 0 & \forall P \in \mathcal{P} \end{array} \end{split}\]

Edge-Disjoint Paths

Ford-Fulkerson algorithm is an efficient algorithm for finding edge-disjoint paths problem in directed graph.

Problem: For a directed graph with two disjoint sets of vertices \(S\) and \(T\), we want to find a maximum-cardinality set \(\mathcal{P}\) of \(S\)-\(T\) paths that are edge-disjoint, i.e. no path in \(\mathcal{P}\) can share any edges.

To solve this,

  1. For every edge \(e\in G\), set capacity \(c(e)=1\). Add one node \(s\) that connects to every vertex \(u\) in \(S\) with capacity \(\infty\). Add one node \(t\) that connects to every vertex \(v\) in \(T\) with capacity \(\infty\). Call this flow network \(H\).

    \[ s \overset{\infty}{-} S \cdots T \overset{\infty}{-} t \]
  2. Run Ford-Fulkerson algorithm on \(H\) to obtain a flow \(f\). Since \(f(e)\le c(e)=1\) and is integral, it is 1.

  3. Run flow-path decomposition, then each path also carries path-flow value 1. When we delete the path, we actually remove all edges along the path since \(c(e)=1\). Moreover, the subsequent paths must be disjoint with this one since \(c(e)=1\). We will get a collection of EDP from \(S\) to \(T\). The number of paths equals to the flow value.

\(S\)-\(T\) Cut

Problem: Given two sets of vertices \(S\) and \(T\) in a directed graph \(G\), what is the minimum number of edges needed to disconnect \(S\) from \(T\)? Formally, find a minimum-cardinality edge set \(E ^\prime \subseteq E\) such that in the remaining graph \(G \setminus E ^\prime\), there is no path from a vertex of \(S\) to a vertex of \(T\).

Menger’s Theorem

The maximum number of EDPs connecting \(S\) to \(T\) is equal to the minimum number of edges needed to disconnect \(S\) from \(T\).

The same can be done for undirected graphs.

Vertex-capacitated Max Flow

In reality, capacities are often defined on vertices, such as computer networks. Each vertex has capacity constraint \(c(v)\). The capacity constraints are on vertices: the total inflow into any vertex \(v\) is at most \(c(v)\). The conservation becomes: for each vertex, outflow = inflow. How to find a maximum flow?

We reduce this problem to the usual max flow problem buy convert an vertex-capacitated max flow problem instance \(I_V\) into an edge-capacitated problem instance \(I_E\), and show that we can solve \(I_V\) by solving \(I_E\).

  • replace node \(v \in V \setminus \left\{ s,t \right\}\) by two nodes \(v_{in}\) and \(v_{out}\)

  • replace edge \((u,v)\) by \((u_{out}, v_{in})\)

    • replace edge \((s,v)\) by \((s, v_{in})\)

    • replace edge \((v,t)\) by \((v_{out}, t)\)

    • assign these edge infinite capacities

  • add edge \((v_{in}, v_{out})\) with capacity \(c(v)\)

Given a flow \(f_V\) on \(I_V\), transform it into a flow \(f_E\) for \(I_E\) by

\[\begin{split}\begin{aligned} f _E (u_{out}, v_{in}) &= f_V(u, v) \\ f _E (v_{out}, t) &= f_V(v, t) \\ f _E (s, v_{in}) &= f_V(s, v) \\ f _E (v_{in}, v_{out}) &= \sum_{u:(u,v) \in E} f_V(u, v) \\ \end{aligned}\end{split}\]

In this way, \(f _E\) is a valid flow, and values of flow for \(f_V\) and \(f_E\) are \(\sum_{v:(s, v) \in E\left(I_{V}\right)} f_V(s, v)\) and \(\sum_{v_{i n}:\left(s, v_{i n}\right) \in E\left(I_{E}\right)} f_E\left(s, v_{i n}\right)\) respectively.

In the other direction, given \(f_E\), we can construct \(f\) by similar rules as above. Vertex capacity constraints will be satisfied by inflow into a vertex \(v\), which must be at most \(c(v)\) as \(f_E\) is valid.

Algorithmically, given \(I_V\), we construct instance \(I_E\), run Fold-Fulkerson algorithm on \(I_E\) to obtain optimal flow \(f_E\), and convert the flow \(f_E\) into an optimal \(f_V\) for \(I_V\) as described above.

Other problems under this setting:

  • \(s\)-\(t\) cut:

    Find a minimum cardinality subet \(V ^\prime \subseteq V \setminus \left\{ s,t \right\}\) such that \(G \setminus V ^\prime\) hs no \(s\)-\(t\) path. Proof: show that any edge cut in \(I_E\) corresponds to a vertex cut in \(I_V\) of the same value, and vice versa.

  • max-flow min-cut:

    \(\operatorname{Max}\)-\(\operatorname{flow}\left(I_{V}\right)=\operatorname{Max}\)-\(\operatorname{Mow}\left(I_{E}\right)=\operatorname{Min}\)-\(\operatorname{cut}\left(I_{E}\right)=\operatorname{Min}\)-\(\operatorname{cut}\left(I_{V}\right)\)

  • Menger’s Theorem

    The maximum number of vertex-disjoint path connecting \(S\) to \(T\) is equal to the minimum number of vertices needed to remove to disconnect \(S\) from \(T\).

    Create a super-source \(s\) and a super sink \(t\) connected respectively to all vertices of \(S\) and \(T\). Give every other vertex (except \(s\) and \(t\)) a capacity of 1. Then max-fow equals maximum number of node disjoint paths between \(S\) and \(T\) and min-cut equals minimum cardinality subset we remove to disconnect \(S,T\).

Applications

Image Segmentation

An image can be viewed as a vertex. We want to partition an image into two parts, e.g. foreground and background. For pixel/vertex \(s\), let \(a_v\) be how likely \(v\) to be in a part, and \(b_v\) be how likely \(v\) to be in the other part.

To solve this, we define strength/similarity for every pair of pixels \(s_{u,v}\). The ultimate task is to partition the pixels into two sets \(X\) and \(Y\). The similarity of two pixels from different partition should be small. The objective is

\[ \max \left\{ \sum_{v \in X} a_v + \sum_{u \in Y} b_u - \sum_{v \in X, u\in Y} s_{v,u} \right\} \]

which is equivalent to

\[ \min \left\{ \sum_{v \in X, u\in Y} P_{v,u} - \sum_{v \in X} a_v - \sum_{u \in Y} b_u \right\} \]

which is equivalent to

\[ \min \left\{ \sum_{v \in X, u\in Y} s_{v,u} - \sum_{v \in X} a_v - \sum_{u \in Y} b_u + \sum_{w \in V} (a_w + b_w) \right\} \]

which is

\[ \min \left\{ \sum_{v \in X, u\in Y} s_{v,u} + \sum_{v \in Y} a_v + \sum_{u \in X} b_u \right\} \]

We can solve this with minimum cut on undirected graph. The capacity of an edge is the strength of that edge. For every vertex \(v\), add edge \((s,v)\) of capacity \(a_v\), and edge \((v, t)\) of capacity \(b_v\). Also for add edge \(e(v,u)\) of capacity \(s_{v,u}\) for \(u,v \ne s,t\). Consider an \(s\)-\(t\) cut \((A,B)\), denote \(X = A \backslash \left\{ s \right\}\) and \(Y = B \backslash \left\{ t \right\}\).

Claim

The capacity of the cut equals the value of the objective function. So the optimization problem in image segmentation can be solved by the minimum cut problem.

\[ c(A,B) = \sum _{e \in E(A,B)} c(e) = f(X,Y) \]

Proof

There are 3 kinds of across-set edges in \(E(A, B)\)

  1. \(e=(u,v), u\ne s, v\ne t\), contribute \(s_e\)

  2. \(e=(s,x), x\in B \backslash \left\{ t \right\}\) with edge capacity \(a_x\). Total contribute \(\sum_{x \in Y} a_x\)

  3. \(e=(y,t), y\in A \backslash \left\{ s \right\}\) with edge capacity \(a_x\). Total contribute \(\sum_{b \in X} b_y\)

Hence

\[ c(A,B) = \sum_{v \in X, u\in Y} s_{v,u} + \sum_{v \in Y} a_v + \sum_{u \in X} b_u \]

which is exactly the objective function.

\(\square\)

Exercise

Let \(G\) be an arbitrary (directed) flow network with integral edge capacities

  1. [Change of capacity] Prove or disapprove:

    1. Let \(e=(u,v)\) be an edge of \(G\) with capacity \(c(e) ≥ 1\). Decreasing the capacity of an edge \(e\) by \(1\) decreases the maximum flow value by at most \(1\).

    2. Let \(e=(u,v)\) be an edge of \(G\) with capacity \(c(e) ≥ k\) where \(k\) is a positive integer. Decreasing the capacity of an edge \(e\) by \(k\) decreases the maximum flow value by at most \(k\).

    3. Increasing the capacity of an edge \(e\) by \(1\) increases the maximum flow value by at most \(1\).

    4. Increasing the capacity of an edge \(e\) by a positive integer \(k\) increases the maximum flow value by at most \(k\).

    5. Let \((A,B)\) be a minimum \(s\)-\(t\) cut in G. If we increase the capacity of each edge in \(E(G)\) by \(1\), then \((A,B)\) remains a minimum \(s\)-\(t\) cut in the new flow network.

  2. [Edges in residual graph] Suppose we are given a flow network \(G\), and a valid flow \(f\) in that network. Let \(G_f\) be the corresponding residual graph, \(P\) a shortest \(s\)-\(t\) path in \(G_f\), and \(f ^\prime\) a new flow obtained from \(f\) after performing a single iteration of the Ford-Fulkerson algorithm, with \(P\) as the augmenting path. Prove each one of the following statements.

    1. If \(e \in G_f\) but \(e \notin G _{f ^\prime}\), then \(e\in P\).

    2. At least one edge of \(P\) does not belong to \(G_{f ^\prime}\).

    3. If \(e=(u,v) \in G_{f ^\prime }\) but \(e \notin G_f\), then edge \((v,u)\) belongs to path \(P\).

  3. T/F: If \(f\) is a valid \(s\)-\(t\) flow in graph \(G\) of value \(v_f\), and \(f ^\prime\) is a valid \(s\)-\(t\) flow in the residual graph \(G_f\) of value \(v(f ^\prime)\), then there is a valid \(s\)-\(t\) flow in graph G of value \(v(f) + v(f ^\prime)\).

  4. [Acyclic flow] Show an efficient algorithm to find a maximum \(s\)-\(t\) flow in \(G\) which is integral and acyclic.

  5. [Incoming edges to source and outgoing edge from sink] Assume now that vertex \(s\) may have incoming edges and \(t\) may have outgoing edges. Recall that in such a case, the value of a flow \(f\) is de ned to be \(\sum_{e \in \delta^{+}(s)} f(e)-\sum_{e \in \delta^{-}(s)} f(e)\). Prove that there exists a maximum flow \(f\), such that \(f(e)=0\) for every edge \(e \in \delta^{-}(s) \cup \delta^{+}(t)\).

More

http://www.cim.mcgill.ca/~langer/251/E11-networkflow-2.pdf

http://web.stanford.edu/class/archive/cs/cs161/cs161.1176/maxflow_problems.pdf

https://courses.engr.illinois.edu/cs573/fa2012/hw/files/hw_3_pract.pdf

https://www.cs.cornell.edu/courses/cs6820/2016fa/handouts/flows.pdf