Skip to main content
\(\newcommand{\set}[1]{\{1,2,\dotsc,#1\,\}} \newcommand{\ints}{\mathbb{Z}} \newcommand{\posints}{\mathbb{N}} \newcommand{\rats}{\mathbb{Q}} \newcommand{\reals}{\mathbb{R}} \newcommand{\complexes}{\mathbb{C}} \newcommand{\twospace}{\mathbb{R}^2} \newcommand{\threepace}{\mathbb{R}^3} \newcommand{\dspace}{\mathbb{R}^d} \newcommand{\nni}{\mathbb{N}_0} \newcommand{\nonnegints}{\mathbb{N}_0} \newcommand{\dom}{\operatorname{dom}} \newcommand{\ran}{\operatorname{ran}} \newcommand{\prob}{\operatorname{prob}} \newcommand{\Prob}{\operatorname{Prob}} \newcommand{\height}{\operatorname{height}} \newcommand{\width}{\operatorname{width}} \newcommand{\length}{\operatorname{length}} \newcommand{\crit}{\operatorname{crit}} \newcommand{\inc}{\operatorname{inc}} \newcommand{\HP}{\mathbf{H_P}} \newcommand{\HCP}{\mathbf{H^c_P}} \newcommand{\GP}{\mathbf{G_P}} \newcommand{\GQ}{\mathbf{G_Q}} \newcommand{\AG}{\mathbf{A_G}} \newcommand{\GCP}{\mathbf{G^c_P}} \newcommand{\PXP}{\mathbf{P}=(X,P)} \newcommand{\QYQ}{\mathbf{Q}=(Y,Q)} \newcommand{\GVE}{\mathbf{G}=(V,E)} \newcommand{\HWF}{\mathbf{H}=(W,F)} \newcommand{\bfC}{\mathbf{C}} \newcommand{\bfG}{\mathbf{G}} \newcommand{\bfH}{\mathbf{H}} \newcommand{\bfF}{\mathbf{F}} \newcommand{\bfI}{\mathbf{I}} \newcommand{\bfK}{\mathbf{K}} \newcommand{\bfP}{\mathbf{P}} \newcommand{\bfQ}{\mathbf{Q}} \newcommand{\bfR}{\mathbf{R}} \newcommand{\bfS}{\mathbf{S}} \newcommand{\bfT}{\mathbf{T}} \newcommand{\bfNP}{\mathbf{NP}} \newcommand{\bftwo}{\mathbf{2}} \newcommand{\cgA}{\mathcal{A}} \newcommand{\cgB}{\mathcal{B}} \newcommand{\cgC}{\mathcal{C}} \newcommand{\cgD}{\mathcal{D}} \newcommand{\cgE}{\mathcal{E}} \newcommand{\cgF}{\mathcal{F}} \newcommand{\cgG}{\mathcal{G}} \newcommand{\cgM}{\mathcal{M}} \newcommand{\cgN}{\mathcal{N}} \newcommand{\cgP}{\mathcal{P}} \newcommand{\cgR}{\mathcal{R}} \newcommand{\cgS}{\mathcal{S}} \newcommand{\bfn}{\mathbf{n}} \newcommand{\bfm}{\mathbf{m}} \newcommand{\bfk}{\mathbf{k}} \newcommand{\bfs}{\mathbf{s}} \newcommand{\bijection}{\xrightarrow[\text{onto}]{\text{$1$--$1$}}} \newcommand{\injection}{\xrightarrow[]{\text{$1$--$1$}}} \newcommand{\surjection}{\xrightarrow[\text{onto}]{}} \newcommand{\nin}{\not\in} \newcommand{\prufer}{\mbox{prüfer}} \DeclareMathOperator{\fix}{fix} \DeclareMathOperator{\stab}{stab} \DeclareMathOperator{\var}{var} \newcommand{\inv}{^{-1}} \newcommand{\lt}{ < } \newcommand{\gt}{ > } \newcommand{\amp}{ & } \)

Section13.1Basic Notation and Terminology

A directed graph in which for each pair of vertices \(x,y\) at most one of the directed edges \((x,y)\) and \((y,x)\) between them is present is called an oriented graph. The basic setup for a network flow problem begins with an oriented graph \(\bfG\), called a network, in which we have two special vertices called the source and the sink. We use the letter \(S\) to denote the source, while the letter \(T\) is used to denote the sink (terminus). All edges incident with the source are oriented away from the source, while all edges incident with the sink are oriented with the sink. Furthermore, on each edge, we have a non-negative capacity, which functions as a constraint on how much can be transmitted via the edge. The capacity of the edge \(e=(x,y)\) is denoted \(c(e)\) or by \(c(x,y)\). In a computer program, the nodes of a network may be identified with integer keys, but in this text, we will typically use letters in labeling the nodes of a network. This helps to distinguish nodes from capacities in diagrams of networks. We illustrate a network in Figure 13.1. The numbers associated with the edges are their capacities, so, for instance, \(c(E,B)=24\) and \(c(A,T)=56\).

<<SVG image is unavailable, or your browser cannot render it>>

Figure13.1A Network

A flow \(\phi\) in a network is a function which assigns to each directed edge \(e=(x,y)\) a non-negative value \(\phi(e)=\phi(x,y)\leq c(x,y)\) so that the following conservation laws hold:

  1. \(\sum_{x} \phi(S,x)= \sum_{x} \phi(x,T)\), i.e., the amount leaving the source is equal to the amount arriving at the sink. This quantity is called the value of the flow \(\phi\).

  2. For every vertex \(y\) which is neither the source nor the sink the amount leaving \(y\) is equal to the amount entering \(y\). That is, \(\sum_{x}\phi(x,y)= \sum_{x}\phi(y,x)\).

We illustrate a flow in a network in Figure 13.2.

<<SVG image is unavailable, or your browser cannot render it>>

Figure13.2A Network Flow

In this figure, the numbers associated with each edge are its capacity and the amount of flow that \(\phi\) places on that edge. For example, the edge \((E,D)\) has capacity \(20\) and currently carries a flow of \(8\). (Since \(\phi(x,y)\leq c(x,y)\), it is always easy to determine which number is the capacity and which is the flow.) The value of this flow is \(30 = \phi(S,F)+\phi(S,B)+\phi(S,E)=\phi(A,T)+\phi(C,T)\). To see that the second conservation law holds at, for example, vertex \(B\), note that the flow into \(B\) is \(\phi(S,B)+\phi(E,B)+\phi(D,B) = 20\) and the flow out of \(B\) is \(\phi(B,F)+\phi(B,A)+\phi(B,C)=20\).

Given a network, it is very easy to find a flow. We simply assign \(\phi(e)=0\) for every edge \(e\). It is very easy to underestimate the importance of this observation, actually. Network flow problems are a special case of a more general class of optimization problems known as linear programs, and in general, it may be very difficult to find a feasible solution to a linear programming problem. In fact, conceptually, finding a feasible solution—any solution—is just as hard as finding an optimal solution.