In
theoretical computer science
Theoretical computer science is a subfield of computer science and mathematics that focuses on the Abstraction, abstract and mathematical foundations of computation.
It is difficult to circumscribe the theoretical areas precisely. The Associati ...
and
network routing
Routing is the process of selecting a path for traffic in a network or between or across multiple networks. Broadly, routing is performed in many types of networks, including circuit-switched networks, such as the public switched telephone netw ...
, Suurballe's algorithm is an algorithm for finding two disjoint paths in a nonnegatively-weighted
directed graph, so that both paths connect the same pair of
vertices and have minimum total length. The algorithm was conceived by John W. Suurballe and published in 1974. The main idea of Suurballe's algorithm is to use
Dijkstra's algorithm
Dijkstra's algorithm ( ) is an algorithm for finding the shortest paths between nodes in a weighted graph, which may represent, for example, a road network. It was conceived by computer scientist Edsger W. Dijkstra in 1956 and published three ...
to find one path, to modify the weights of the graph edges, and then to run Dijkstra's algorithm a second time. The output of the algorithm is formed by combining these two paths, discarding edges that are traversed in opposite directions by the paths, and using the remaining edges to form the two paths to return as the output.
The modification to the weights is similar to the weight modification in
Johnson's algorithm
Johnson's algorithm is a way to find the shortest paths between all pairs of vertices in an edge-weighted directed graph. It allows some of the edge weights to be negative numbers, but no negative-weight cycles may exist. It works by using th ...
, and preserves the non-negativity of the weights while allowing the second instance of Dijkstra's algorithm to find the correct second path.
The problem of finding two disjoint paths of minimum weight can be seen as a special case of a
minimum cost flow
The minimum-cost flow problem (MCFP) is an optimization and decision problem to find the cheapest possible way of sending a certain amount of flow through a flow network. A typical application of this problem involves finding the best delivery rou ...
problem, where in this case there are two units of "flow" and nodes have unit "capacity". Suurballe's algorithm, also, can be seen as a special case of a minimum cost flow algorithm that repeatedly pushes the maximum possible amount of flow along a shortest augmenting path.
The first path found by Suurballe's algorithm is the shortest augmenting path for the initial (zero) flow, and the second path found by Suurballe's algorithm is the shortest augmenting path for the
residual graph
In graph theory, a flow network (also known as a transportation network) is a directed graph where each edge has a capacity and each edge receives a flow. The amount of flow on an edge cannot exceed the capacity of the edge. Often in operations re ...
left after pushing one unit of flow along the first path.
Definitions
Let be a weighted directed graph with vertex set and edge set (figure A); let be a designated source vertex in , and let be a designated destination vertex. Let each edge in , from vertex to vertex , have a non-negative cost .
Define to be the cost of the
shortest path
In graph theory, the shortest path problem is the problem of finding a path between two vertices (or nodes) in a graph such that the sum of the weights of its constituent edges is minimized.
The problem of finding the shortest path between two ...
to vertex from vertex in the shortest path tree rooted at (figure C).
Note: Node and Vertex are often used interchangeably.
Algorithm
Suurballe's algorithm performs the following steps:
# Find the shortest path tree rooted at node by running Dijkstra's algorithm (figure C). This tree contains for every vertex , a shortest path from to . Let be the shortest cost path from to (figure B). The edges in are called ''tree edges'' and the remaining edges (the edges missing from figure C) are called ''non-tree edges''.
# Modify the cost of each edge in the graph by replacing the cost of every edge by . According to the resulting modified cost function, all tree edges have a cost of 0, and non-tree edges have a non-negative cost. For example:
If , then
If , then
# Create a residual graph formed from by removing the edges of on path that are directed into and then reverse the direction of the zero length edges along path (figure D).
# Find the shortest path in the residual graph by running Dijkstra's algorithm (figure E).
# Discard the reversed edges of from both paths. The remaining edges of and form a subgraph with two outgoing edges at , two incoming edges at , and one incoming and one outgoing edge at each remaining vertex. Therefore, this subgraph consists of two edge-disjoint paths from to and possibly some additional (zero-length) cycles. Return the two disjoint paths from the subgraph.
Example
The following example shows how Suurballe's algorithm finds the shortest pair of disjoint paths from ''A'' to ''F''.

Figure A illustrates a weighted graph ''G''.
Figure B calculates the shortest path ''P''
1 from ''A'' to ''F'' (''A''–''B''–''D''–''F'').
Figure C illustrates the shortest path tree ''T'' rooted at ''A'', and the computed distances from ''A'' to every vertex ().
Figure D shows the residual graph ''G
t'' with the updated cost of each edge and the edges of path ''P''
1 reversed.
Figure E calculates path ''P''
2 in the residual graph ''G
t'' (''A''–''C''–''D''–''B''–''E''–''F'').
Figure F illustrates both path ''P''
1 and path ''P''
2.
Figure G finds the shortest pair of disjoint paths by combining the edges of paths ''P''
1 and ''P''
2 and then discarding the common reversed edges between both paths (''B''–''D''). As a result, we get the two shortest pair of disjoint paths (''A''–''B''–''E''–''F'') and (''A''–''C''–''D''–''F'').
Correctness
The weight of any path from to in the modified system of weights equals the weight in the original graph, minus . Therefore, the shortest two disjoint paths under the modified weights are the same paths as the shortest two paths in the original graph, although they have different weights.
Suurballe's algorithm may be seen as a special case of the successive shortest paths method for finding a
minimum cost flow
The minimum-cost flow problem (MCFP) is an optimization and decision problem to find the cheapest possible way of sending a certain amount of flow through a flow network. A typical application of this problem involves finding the best delivery rou ...
with total flow amount two from to . The modification to the weights does not affect the sequence of paths found by this method, only their weights. Therefore, the correctness of the algorithm follows from the correctness of the successive shortest paths method.
Analysis and running time
This algorithm requires two iterations of Dijkstra's algorithm. Using
Fibonacci heap
In computer science, a Fibonacci heap is a data structure for priority queue operations, consisting of a collection of heap-ordered trees. It has a better amortized running time than many other priority queue data structures including the binar ...
s, both iterations can be performed in time
where
and
are the number of vertices and edges respectively. Therefore, the same time bound applies to Suurballe's algorithm.
Variations
The version of Suurballe's algorithm as described above finds paths that have disjoint edges, but that may share vertices. It is possible to use the same algorithm to find vertex-disjoint paths, by replacing each vertex by a pair of adjacent vertices, one with all of the incoming adjacencies of the original vertex, and one with all of the outgoing adjacencies . Two edge-disjoint paths in this modified graph necessarily correspond to two vertex-disjoint paths in the original graph, and vice versa, so applying Suurballe's algorithm to the modified graph results in the construction of two vertex-disjoint paths in the original graph. Suurballe's original 1974 algorithm was for the vertex-disjoint version of the problem, and was extended in 1984 by Suurballe and Tarjan to the edge-disjoint version.
[.]
By using a modified version of Dijkstra's algorithm that simultaneously computes the distances to each vertex in the graphs , it is also possible to find the total lengths of the shortest pairs of paths from a given source vertex to every other vertex in the graph, in an amount of time that is proportional to a single instance of Dijkstra's algorithm.
Note: The pair of adjacent vertices resulting from the split are connected by a zero cost uni-directional edge from the incoming to outgoing vertex. The source vertex becomes and the destination vertex becomes .
See also
*
Edge disjoint shortest pair algorithm
Edge disjoint shortest pair algorithm is an algorithm in computer network routing. The algorithm is used for generating the shortest pair of edge disjoint paths between a given pair of vertices. For an undirected graph G(V, E), it is stated as fol ...
References
{{Reflist
Graph algorithms
Routing algorithms