Let G be a weighted directed graph with vertex set V and edge set E (figure A); let s be a designated source vertex in G, and let t be a designated destination vertex. Let each edge (u,v) in E, from vertex u to vertex v, have a non-negative cost w(u,v).
Define d(s,u) to be the cost of the shortest path to vertex u from vertex s in the shortest path tree rooted at s (figure C).
Note: Node and Vertex are often used interchangeably.
Suurballe's algorithm performs the following steps:
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 P1 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 (u).
Figure D shows the residual graph Gt with the updated cost of each edge and the edges of path P1 reversed.
Figure E calculates path P2 in the residual graph Gt (A–C–D–B–E–F).
Figure F illustrates both path P1 and path P2.
Figure G finds the shortest pair of disjoint paths by combining the edges of paths P1 and P2 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).
The weight of any path from s to t in the modified system of weights equals the weight in the original graph, minus d(s,t). 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 with total flow amount two from s to t. 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.
This algorithm requires two iterations of Dijkstra's algorithm. Using Fibonacci heaps, both iterations can be performed in time O ( | E | + | V | log | V | ) {\displaystyle O(|E|+|V|\log |V|)} where | V | {\displaystyle |V|} and | E | {\displaystyle |E|} are the number of vertices and edges respectively. Therefore, the same time bound applies to Suurballe's algorithm.
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 u-in of the original vertex, and one with all of the outgoing adjacencies u-out. 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.3
By using a modified version of Dijkstra's algorithm that simultaneously computes the distances to each vertex t in the graphs Gt, it is also possible to find the total lengths of the shortest pairs of paths from a given source vertex s 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 s-out and the destination vertex becomes t-in.
Bhandari, Ramesh (1999), "Suurballe's disjoint pair algorithms", Survivable Networks: Algorithms for Diverse Routing, Springer-Verlag, pp. 86–91, ISBN 978-0-7923-8381-9. 978-0-7923-8381-9 ↩
Suurballe, J. W. (1974), "Disjoint paths in a network", Networks, 4 (2): 125–145, doi:10.1002/net.3230040204. /wiki/Doi_(identifier) ↩
Suurballe, J. W.; Tarjan, R. E. (1984), "A quick method for finding shortest pairs of disjoint paths" (PDF), Networks, 14 (2): 325–336, doi:10.1002/net.3230140209. /wiki/Robert_Tarjan ↩