Summary & Motivations: Section 7.1 is The Maximum-Flow Problem and the Ford-Fulkerson Algorithm. This subsection addresses network models, and the key pieces for any such problem are capacities on edges, a source node, a sink node, and the traffic that flows on the network. For simplicity, we assume the capacities are integers. While defining flow, we assert two conditions: the capacity condition and the conservation condition. The capacity condition says that every edge has a flow between 0 and its capacity; the conservation condition says that for each node other than the source and the sink, the flows going into the node equal the flows going out of the node. We also say that the value of a flow is the flow coming out of the source. Given such a flow network, we want to find a maximum flow.
About the Algorithms: We see that dynamic and greedy approaches to this problem do not give the optimal solution. The key insight to the algorithm we'll develop is that “we can push forward on edges with leftover capacity, and we can push backward on edges that are already carrying flow, to divert it in a different direction” (p 341). To characterize this setup, we create a residual graph. This residual graph has all the same nodes as G, but the original edges map to leftover capacity, and there are new edges in the reverse direction to represent the flow that we can undo. Before we get to the Max-Flow algorithm, we need a mini-algorithm, augment(f,P), which takes the flow in G and an s-t path P, finds the bottleneck (minimum residual capacity) in P, pushes that amount of flow through P by subtracting flow if there is a residual or reversing flow if not, and returns the augmented flow. The runtime of the augment algorithm is O(m), where m is the number of edges in G. This is what we need in order to push flow back and forth, so we can move on to the real algorithm, Max-Flow. This is the Ford-Fulkerson Algorithm, and here are its specifics: we set all edge flows to 0 initially. Then, while there is an s-t path in the residual graph G_f, we let P be a simple s-t path in G_f, let f' = augment(f,P), update f to f', and update G_f to G_{f'}. The runtime for this algorithm is O(Cm) where C is the maximum possible flow if all edges out of the source are saturated. Upon each iteration, the flow value strictly increases until the Max-Flow is found.