
9.10 NOTES & SELECTED BIBLIOGRAPHY 303
established the theorem for general networks. It was also discovered independently by
Elias, Feinstein, & Shannon [1956]. A comprehensive treatment of the maximal flow
problem and related matters can be found in Ford & Fulkerson [1962].
The classical augmenting path method for finding a maximum flow through a network
was developed by Ford & Fulkerson [1957] based on earlier work by Kuhn [1955] and
Egerv´ary [1931]. Fulkerson & Dantzig [1955] and Dantzig & Fulkerson [1956a] developed
a tree method for solving maximal flow problems that is also described in Dantzig [1963].
The approach constructs two subtrees, one branching out from the source and the other
branching out from the destination so that every intermediate node is reached by just one
of the trees. Then a connecting arc between the two trees and an associated path from
source to destination is found, and finally the maximum flow along the path is assigned.
The network displayed in Example 9.10 due to Chv´atal [1983] is a smaller network than
that used in the example by Ford & Fulkerson [1962] but based on the same type of
recurrence relation. The proofs of Lemma 9.12 and Theorem 9.13 can be found in Linear
Programming 2.
J. Edmonds & R.M. Karp [1972] showed that an augmenting path method called first-
labeled first-scanned finds a maximum flow within mn/2 iterations, where n is the number
of arcs and m is the number of nodes in the network, regardless of what the upper bounds
h
ij
on the arcs are. This method then finds the maximal flow in O(n
2
m) operations
because it can be shown that each iteration of the augmenting path method takes only
O(n) comparisons to find an augmenting path. The proof of Theorem 9.11 can be found
in Edmonds & Karp [1972] and in Linear Programming 2. Around the same time as
Edmonds & Karp’s results, Dinic [1970] independently designed a faster algorithm that
requires O(m
2
n) operations. Later Malhotra, Kumar, & Maheshwari [1978] developed an
algorithm that requires O(m
3
) operations. For networks that have n m
2
, an algorithm
designed by Galil [1978] takes O(m
5/3
n
2/3
) operations, and an algorithm designed by
Sleator [1980] takes only O(nm log m) steps.
Shortest path problems come up often in practice and arise as subproblems in many
network problems. Dantzig first proposed a method for finding the shortest path from a
source node to a destination node in a network, see Dantzig [1960a], based on an earlier
RAND research memorandum. At about the same time, Dijkstra [1959] proposed another
algorithm for finding the shortest directed paths from a node to all other nodes. The
Dijkstra algorithm takes O(m
2
) operations. See also Bellman [1958]. Independently,
Whiting & Hillier [1960] also developed a shortest route algorithm. Johnson [1977] has
shown that this bound can be further reduced to O(n log
k
m) operations, where k =
max(2, n/m). See also Denardo & Fox [1979], Dial [1969], Moore [1959], and Pape [1974].
A summary of various classical algorihtms can be found in Gallo & Pallottino [1988].
Improvements have continued to be made in shortest path algorithms; see, for example,
Ahuja, Mehlhorn, Orlin, & Tarjan [1990], Fredman & Willard [1987] Gabow & Tarjan
[1989], Goldberg [1993], and Goldberg & Radzik [1993]. Under the assumption that arc
lengths are integers between 0 and L where L ≥ 2, Ahuja, Mehlhorn, Orlin, & Tarjan’s
algorithm runs in O(n + m
√
log L). For theory and experimental evaluation of shortest
path algorithms see Cherkassky, Goldberg, & Radzik [1996]; in this paper the authors
show that some algorithms behave in exactly the same way on two networks, one of which
is obtained from the other by replacing the arc lengths by the reduced costs with respect
to a potential function; that is, the algorithms are potential-invariant. This implies, for
example, that a feasible shortest path problem has an equivalent with nonnegative arc
lengths.
The minimal spanning tree algorithm described here is due to Kruskal [1956].