- Floyd–Warshall algorithm
In
computer science , the Floyd–Warshall algorithm (sometimes known as the WFI Algorithm or Roy–Floyd algorithm, sinceBernard Roy described this algorithm in1959 ) is a graph analysisalgorithm for finding shortest paths in a weighted, directed graph. A single execution of the algorithm will find the shortest paths between all pairs of vertices. The Floyd–Warshall algorithm is an example ofdynamic programming .Algorithm
The Floyd-Warshall algorithm compares all possible paths through the graph between each pair of vertices. It is able to do this with only comparisons. This is remarkable considering that there may be up to edges in the graph, and every combination of edges is tested. It does so by incrementally improving an estimate on the shortest path between two vertices, until the estimate is known to be optimal.
Consider a graph with vertices , each numbered 1 through N. Further consider a function that returns the shortest possible path from to using only vertices 1 through as intermediate points along the way. Now, given this function, our goal is to find the shortest path from each to each using only nodes 1 through .
There are two candidates for this path: either the true shortest path only uses nodes in the set ; or there exists some path that goes from to , then from to that is better. We know that the best path from to that only uses nodes 1 through is defined by , and it is clear that if there were a better path from to to , then the length of this path would be the concatenation of the shortest path from to (using vertices in ) and the shortest path from to (also using vertices in ).
Therefore, we can define in terms of the following
recursive formula:This formula is the heart of Floyd Warshall. The algorithm works by first computing for all (i,j) pairs, then using that to find for all pairs, etc. This process continues until k=n, and we have found the shortest path for all pairs using any intermediate vertices.
Pseudocode
Conveniently, when calculating the th case, one can overwrite the information saved from the computation of . This means the algorithm uses quadratic memory. Be careful to note the initialization conditions:
1 /* Assume a function "edgeCost"(i,j) which returns the cost of the edge from i to j 2 (infinity if there is none). 3 Also assume that n is the number of vertices and "edgeCost"(i,i)=0 4 */ 5 6 int path [] [] ; 7 /* A 2-dimensional matrix. At each step in the algorithm, path [i] [j] is the shortest path 8 from i to j using intermediate values in (1..k-1). Each path [i] [j] is initialized to 9 "edgeCost"(i,j). 10 */ 11 12 procedure "FloydWarshall" () 13 for to 14 for each in 15 path [i] [j] = min ( path [i] [j] , path [i] [k] +path [k] [j] );
Behaviour with negative cycles
For numerically meaningful output, Floyd-Warshall assumes that there are no negative cycles (in fact, between any pair of vertices which form part of a negative cycle, the shortest path is not well-defined because the path can be infinitely small). Nevertheless, if there are negative cycles, Floyd–Warshall can be used to detect them. A negative cycle can be detected if the "path" matrix contains a negative number along the diagonal. If path [i] [i] is negative for some vertex i, then this vertex belongs to at least one negative cycle.
Analysis
To find all of from those of requires bit operations. Since we begin with and compute the sequence of zero-one matrices , , , , the total number of bit operations used is . Therefore, the complexity of the algorithm is and can be solved by a deterministic machine in
polynomial time .Applications and generalizations
The Floyd–Warshall algorithm can be used to solve the following problems, among others:
* Shortest paths in directed graphs (Floyd's algorithm).
*Transitive closure of directed graphs (Warshall's algorithm). In Warshall's original formulation of the algorithm, the graph is unweighted and represented by a Boolean adjacency matrix. Then the addition operation is replaced bylogical conjunction (AND) and the minimum operation bylogical disjunction (OR).
* Finding aregular expression denoting theregular language accepted by afinite automaton (Kleene's algorithm)
* Inversion of real matrices (Gauss-Jordan algorithm).
* Optimal routing. In this application one is interested in finding the path with the maximum flow between two vertices. This means that, rather than taking minima as in the pseudocode above, one instead takes maxima. The edge weights represent fixed constraints on flow. Path weights represent bottlenecks; so the addition operation above is replaced by the minimum operation.
* Testing whether anundirected graph is bipartite.Implementations
* A
Perl implementation is available in the [http://search.cpan.org/search?query=Graph&mode=all Graph] module
* AJavascript implementation is available at [http://alexle.net/stuff/floyd-algorithm/ Alex Le's Blog]
* A Python implementation is available in the [https://networkx.lanl.gov/ NetworkX] package
* A C implementation is available at [http://www.ece.rice.edu/~jpr/research/fwarsh.html ece.rice.edu]
* AC++ implementation is available in the [http://www.boost.org/libs/graph/doc/ boost::graph] library
* A Java implementation is in the [http://svn.apache.org/repos/asf/commons/dormant/graph2/branches/jakarta/src/java/org/apache/commons/graph/impl/AllPaths.java Apache commons graph] library.References
*
** Section 26.2, "The Floyd–Warshall algorithm", pp. 558–565;
** Section 26.4, "A general framework for solving path problems in directed graphs", pp. 570–576.
*
*
*
*ee also
*
Robert Floyd
*Stephen Warshall
*Dijkstra's algorithm External links
* [http://tide4javascript.com/?s=Floyd Analyze Floyd's algorithm in an online Javascript IDE]
* [http://www.pms.informatik.uni-muenchen.de/lehre/compgeometry/Gosper/shortest_path/shortest_path.html#visualization Interactive animation of Floyd–Warshall algorithm]
Wikimedia Foundation. 2010.