Movatterモバイル変換


[0]ホーム

URL:


Jump to content
WikipediaThe Free Encyclopedia
Search

Floyd–Warshall algorithm

From Wikipedia, the free encyclopedia
Algorithm in graph theory

"Floyd's algorithm" redirects here. For cycle detection, seeFloyd's cycle-finding algorithm. For computer graphics, seeFloyd–Steinberg dithering.
Floyd–Warshall algorithm
ClassAll-pairs shortest path problem (for weighted graphs)
Data structureGraph
Worst-caseperformanceΘ(|V|3){\displaystyle \Theta (|V|^{3})}
Best-caseperformanceΘ(|V|3){\displaystyle \Theta (|V|^{3})}
AverageperformanceΘ(|V|3){\displaystyle \Theta (|V|^{3})}
Worst-casespace complexityΘ(|V|2){\displaystyle \Theta (|V|^{2})}

Incomputer science, theFloyd–Warshall algorithm (also known asFloyd's algorithm, theRoy–Warshall algorithm, theRoy–Floyd algorithm, or theWFI algorithm) is analgorithm for findingshortest paths in a directedweighted graph with positive or negative edge weights (but with no negative cycles).[1][2] A single execution of the algorithm will find the lengths (summed weights) of shortest paths between all pairs of vertices. Although it does not return details of the paths themselves, it is possible to reconstruct the paths with simple modifications to the algorithm. Versions of the algorithm can also be used for finding thetransitive closure of a relationR{\displaystyle R}, or (in connection with theSchulze voting system)widest paths between all pairs of vertices in a weighted graph.

History and naming

[edit]

The Floyd–Warshall algorithm is an example ofdynamic programming, and was published in its currently recognized form byRobert Floyd in 1962.[3] However, it is essentially the same as algorithms previously published byBernard Roy in 1959[4] and also byStephen Warshall in 1962[5] for finding the transitive closure of a graph,[6] and is closely related toKleene's algorithm (published in 1956) for converting adeterministic finite automaton into aregular expression, with the difference being the use of a min-plussemiring.[7] The modern formulation of the algorithm as three nested for-loops was first described by Peter Ingerman, also in 1962.[8]

Algorithm

[edit]

The Floyd–Warshall algorithm compares many possible paths through the graph between each pair of vertices. It is guaranteed to find all shortest paths and is able to do this withΘ(|V|3){\displaystyle \Theta (|V|^{3})} comparisons in a graph,[1][9] even though there may beΘ(|V|2){\displaystyle \Theta (|V|^{2})} edges in the graph. It does so by incrementally improving an estimate on the shortest path between two vertices, until the estimate is optimal.

Consider a graphG{\displaystyle G} with verticesV{\displaystyle V} numbered 1 through N{\displaystyle N}. Further consider a functionshortestPath(i,j,k){\displaystyle \mathrm {shortestPath} (i,j,k)} that returns the length of the shortest possible path (if one exists) fromi{\displaystyle i} toj{\displaystyle j} using vertices only from the set{1,2,,k}{\displaystyle \{1,2,\ldots ,k\}} as intermediate points along the way. Now, given this function, our goal is to find the length of the shortest path from eachi{\displaystyle i} to eachj{\displaystyle j} usingany vertex in{1,2,,N}{\displaystyle \{1,2,\ldots ,N\}}. By definition, this is the valueshortestPath(i,j,N){\displaystyle \mathrm {shortestPath} (i,j,N)}, which we will findrecursively.

Observe thatshortestPath(i,j,k){\displaystyle \mathrm {shortestPath} (i,j,k)} must be less than or equal toshortestPath(i,j,k1){\displaystyle \mathrm {shortestPath} (i,j,k-1)}: we havemore flexibility if we are allowed to use the vertexk{\displaystyle k}. IfshortestPath(i,j,k){\displaystyle \mathrm {shortestPath} (i,j,k)} is in fact less thanshortestPath(i,j,k1){\displaystyle \mathrm {shortestPath} (i,j,k-1)}, then there must be a path fromi{\displaystyle i} toj{\displaystyle j} using the vertices{1,2,,k}{\displaystyle \{1,2,\ldots ,k\}} that is shorter than any such path that does not use the vertexk{\displaystyle k}. Since there are no negative cycles this path can be decomposed as:

(1) a path fromi{\displaystyle i} tok{\displaystyle k} that uses the vertices{1,2,,k1}{\displaystyle \{1,2,\ldots ,k-1\}}, followed by
(2) a path fromk{\displaystyle k} toj{\displaystyle j} that uses the vertices{1,2,,k1}{\displaystyle \{1,2,\ldots ,k-1\}}.

And of course, these must be ashortest such path (or several of them), otherwise we could further decrease the length. In other words, we have arrived at the recursive formula:

shortestPath(i,j,k)={\displaystyle \mathrm {shortestPath} (i,j,k)=}
min(shortestPath(i,j,k1),{\displaystyle \mathrm {min} {\Big (}\mathrm {shortestPath} (i,j,k-1),}
shortestPath(i,k,k1)+shortestPath(k,j,k1)){\displaystyle \mathrm {shortestPath} (i,k,k-1)+\mathrm {shortestPath} (k,j,k-1){\Big )}}.

The base case is given by

shortestPath(i,j,0)=w(i,j),{\displaystyle \mathrm {shortestPath} (i,j,0)=w(i,j),}

wherew(i,j){\displaystyle w(i,j)} denotes the weight of the edge fromi{\displaystyle i} toj{\displaystyle j} if one exists and ∞ (infinity) otherwise.

These formulas are the heart of the Floyd–Warshall algorithm. The algorithm works by first computingshortestPath(i,j,k){\displaystyle \mathrm {shortestPath} (i,j,k)} for all(i,j){\displaystyle (i,j)} pairs fork=0{\displaystyle k=0}, thenk=1{\displaystyle k=1}, thenk=2{\displaystyle k=2}, and so on. This process continues untilk=N{\displaystyle k=N}, and we have found the shortest path for all(i,j){\displaystyle (i,j)} pairs using any intermediate vertices. Pseudocode for this basic version follows.

Pseudocode

[edit]
let dist be a |V| × |V| array of minimum distances initialized to ∞ (infinity)for each edge (u,v)do    dist[u][v] = w(u,v)// The weight of the edge (u,v)for each vertexvdo    dist[v][v] = 0forkfrom 1to |V|forifrom 1to |V|forjfrom 1to |V|if dist[i][j] > dist[i][k] + dist[k][j]                 dist[i][j] = dist[i][k] + dist[k][j]end if

Note: A common mistake in implementing the Floyd–Warshall algorithm is to misorder the triply nested loops (The correct order isKIJ). The incorrectIJK andIKJ algorithms do not give correct solutions for some instance. However, we can prove that if these are repeated three times, we obtain the correct solutions.[10]

Example

[edit]

The algorithm above is executed on the graph on the left below:

Prior to the first recursion of the outer loop, labeledk = 0 above, the only known paths correspond to the single edges in the graph. Atk = 1, paths that go through the vertex 1 are found: in particular, the path [2,1,3] is found, replacing the path [2,3] which has fewer edges but is longer (in terms of weight). Atk = 2, paths going through the vertices {1,2} are found. The red and blue boxes show how the path [4,2,1,3] is assembled from the two known paths [4,2] and [2,1,3] encountered in previous iterations, with 2 in the intersection. The path [4,2,3] is not considered, because [2,1,3] is the shortest path encountered so far from 2 to 3. Atk = 3, paths going through the vertices {1,2,3} are found. Finally, atk = 4, all shortest paths are found.

The distance matrix at each iteration ofk, with the updated distances inbold, will be:

k = 0j
1234
i10−2
2403
302
4−10
k = 1j
1234
i10−2
2402
302
4−10
k = 2j
1234
i10−2
2402
302
43−110
k = 3j
1234
i10−20
24024
302
43−110
k = 4j
1234
i10−1−20
24024
35102
43−110

Behavior with negative cycles

[edit]

A negative cycle is a cycle whose edges sum to a negative value. There is no shortest path between any pair of verticesi{\displaystyle i},j{\displaystyle j} which form part of a negative cycle, because path-lengths fromi{\displaystyle i} toj{\displaystyle j} can be arbitrarily small (negative). For numerically meaningful output, the Floyd–Warshall algorithm assumes that there are no negative cycles. Nevertheless, if there are negative cycles, the Floyd–Warshall algorithm can be used to detect them. The intuition is as follows:

Hence, to detect negativecycles using the Floyd–Warshall algorithm, one can inspect the diagonal of the path matrix, and the presence of a negative number indicates that the graph contains at least one negative cycle.[9] However, when a negative cycle is present, during the execution of the algorithm exponentially large numbers on the order ofΩ(6nwmax){\displaystyle \Omega (6^{n}\cdot w_{max})} can appear, wherewmax{\displaystyle w_{max}} is the largest absolute value edge weight in the graph. To avoid integer underflow problems, one should check for a negative cycle within the innermost for loop of the algorithm.[11]

Path reconstruction

[edit]

The Floyd–Warshall algorithm typically only provides the lengths of the paths between all pairs of vertices. With simple modifications, it is possible to create a method to reconstruct the actual path between any two endpoint vertices. While one may be inclined to store the actual path from each vertex to each other vertex, this is not necessary, and in fact, is very costly in terms of memory. Instead, we can use theshortest-path tree, which can be calculated for each node inΘ(|E|){\displaystyle \Theta (|E|)} time usingΘ(|V|){\displaystyle \Theta (|V|)} memory, and allows us to efficiently reconstruct a directed path between any two connected vertices.

Pseudocode

[edit]

The arrayprev[u][v] holds the penultimate vertex on the path fromu tov (except in the case ofprev[v][v], where it always containsv even if there is no self-loop onv):[12]

let dist be a|V|×|V|{\displaystyle |V|\times |V|} array of minimum distances initialized to{\displaystyle \infty } (infinity)let prev be a|V|×|V|{\displaystyle |V|\times |V|} array of vertex indices initialized tonullprocedureFloydWarshallWithPathReconstruction()isfor each edge (u, v)do        dist[u][v] = w(u, v)// The weight of the edge (u, v)        prev[u][v] = ufor each vertex vdo        dist[v][v] = 0        prev[v][v] = vfor kfrom 1to |V|do// standard Floyd-Warshall implementationfor ifrom 1to |V|for jfrom 1to |V|if dist[i][j] > dist[i][k] + dist[k][j]then                    dist[i][j] = dist[i][k] + dist[k][j]                    prev[i][j] = prev[k][j]
procedurePath(u, v)isif prev[u][v] = nullthenreturn []    path = [v]whileuvdo        v = prev[u][v]        path.prepend(v)return path

Time complexity

[edit]

Letn{\displaystyle n} be|V|{\displaystyle |V|}, the number of vertices. To find alln2{\displaystyle n^{2}} ofshortestPath(i,j,k){\displaystyle \mathrm {shortestPath} (i,j,k)} (for alli{\displaystyle i} andj{\displaystyle j}) from those ofshortestPath(i,j,k1){\displaystyle \mathrm {shortestPath} (i,j,k-1)} requiresΘ(n2){\displaystyle \Theta (n^{2})} operations. Since we begin withshortestPath(i,j,0)=edgeCost(i,j){\displaystyle \mathrm {shortestPath} (i,j,0)=\mathrm {edgeCost} (i,j)} and compute the sequence ofn{\displaystyle n} matricesshortestPath(i,j,1){\displaystyle \mathrm {shortestPath} (i,j,1)},shortestPath(i,j,2){\displaystyle \mathrm {shortestPath} (i,j,2)},{\displaystyle \ldots },shortestPath(i,j,n){\displaystyle \mathrm {shortestPath} (i,j,n)}, each having a cost ofΘ(n2){\displaystyle \Theta (n^{2})},the totaltime complexity of the algorithm isnΘ(n2)=Θ(n3){\displaystyle n\cdot \Theta (n^{2})=\Theta (n^{3})}.[9][13]

Applications and generalizations

[edit]

The Floyd–Warshall algorithm can be used to solve the following problems, among others:

Implementations

[edit]

Implementations are available for manyprogramming languages.

Comparison with other shortest path algorithms

[edit]

For graphs with non-negative edge weights,Dijkstra's algorithm can be used to find all shortest paths from asingle vertex with running timeΘ(|E|+|V|log|V|){\displaystyle \Theta (|E|+|V|\log |V|)}. Thus, running Dijkstra starting ateach vertex takes timeΘ(|E||V|+|V|2log|V|){\displaystyle \Theta (|E||V|+|V|^{2}\log |V|)}. Since|E|=O(|V|2){\displaystyle |E|=O(|V|^{2})}, this yields a worst-case running time of repeated Dijkstra ofO(|V|3){\displaystyle O(|V|^{3})}. While this matches the asymptotic worst-case running time of the Floyd-Warshall algorithm, the constants involved matter quite a lot. When agraph is dense (i.e.,|E||V|2{\displaystyle |E|\approx |V|^{2}}), the Floyd-Warshall algorithm tends to perform better in practice. When the graph is sparse (i.e.,|E|{\displaystyle |E|} is significantly smaller than|V|2{\displaystyle |V|^{2}}), Dijkstra tends to dominate.

For sparse graphs with negative edges but no negative cycles,Johnson's algorithm can be used, with the same asymptotic running time as the repeated Dijkstra approach.

There are also known algorithms usingfast matrix multiplication to speed up all-pairs shortest path computation in dense graphs, but these typically make extra assumptions on the edge weights (such as requiring them to be small integers).[17][18] In addition, because of the high constant factors in their running time, they would only provide a speedup over the Floyd–Warshall algorithm for very large graphs.

References

[edit]
  1. ^abCormen, Thomas H.;Leiserson, Charles E.;Rivest, Ronald L. (1990).Introduction to Algorithms (1st ed.). MIT Press and McGraw-Hill.ISBN 0-262-03141-8. See in particular Section 26.2, "The Floyd–Warshall algorithm", pp. 558–565 and Section 26.4, "A general framework for solving path problems in directed graphs", pp. 570–576.
  2. ^Kenneth H. Rosen (2003).Discrete Mathematics and Its Applications, 5th Edition. Addison Wesley.ISBN 978-0-07-119881-3.
  3. ^Floyd, Robert W. (June 1962)."Algorithm 97: Shortest Path".Communications of the ACM.5 (6): 345.doi:10.1145/367766.368168.S2CID 2003382.
  4. ^Roy, Bernard (1959)."Transitivité et connexité".C. R. Acad. Sci. Paris (in French).249:216–218.
  5. ^Warshall, Stephen (January 1962)."A theorem on Boolean matrices".Journal of the ACM.9 (1):11–12.doi:10.1145/321105.321107.S2CID 33763989.
  6. ^Weisstein, Eric W."Floyd-Warshall Algorithm".MathWorld.
  7. ^Kleene, S. C. (1956). "Representation of events in nerve nets and finite automata". InC. E. Shannon andJ. McCarthy (ed.).Automata Studies. Princeton University Press. pp. 3–42.
  8. ^Ingerman, Peter Z. (November 1962)."Algorithm 141: Path Matrix".Communications of the ACM.5 (11): 556.doi:10.1145/368996.369016.S2CID 29010500.
  9. ^abcHochbaum, Dorit (2014)."Section 8.9: Floyd-Warshall algorithm for all pairs shortest paths"(PDF).Lecture Notes for IEOR 266: Graph Algorithms and Network Flows. Department of Industrial Engineering and Operations Research,University of California, Berkeley. pp. 41–42.
  10. ^Hide, Ikumi (2019). "Incorrect implementations of the Floyd--Warshall algorithm give correct solutions after three repeats".arXiv:1904.01210 [cs.DS].
  11. ^Stefan Hougardy (April 2010). "The Floyd–Warshall algorithm on graphs with negative cycles".Information Processing Letters.110 (8–9):279–281.doi:10.1016/j.ipl.2010.02.001.
  12. ^"Free Algorithms Book".
  13. ^Baras, John; Theodorakopoulos, George (2022).Path Problems in Networks. Springer International Publishing.ISBN 9783031799839.
  14. ^Gross, Jonathan L.; Yellen, Jay (2003).Handbook of Graph Theory. Discrete Mathematics and Its Applications. CRC Press. p. 65.ISBN 9780203490204..
  15. ^Peñaloza, Rafael."Algebraic Structures for Transitive Closure".Seminar "Graph Algorithms". Dresden University of Technology, Department of Computer Science, Institute for Theoretical Computer Science. Archived fromthe original on 2009-10-22.
  16. ^Gillies, Donald (1993).Scheduling Tasks with AND/OR precedence contraints (PhD Thesis, Appendix B)(PDF) (Report).
  17. ^Zwick, Uri (May 2002). "All pairs shortest paths using bridging sets and rectangular matrix multiplication".Journal of the ACM.49 (3):289–317.arXiv:cs/0008011.doi:10.1145/567112.567114.S2CID 1065901..
  18. ^Chan, Timothy M. (January 2010). "More algorithms for all-pairs shortest paths in weighted graphs".SIAM Journal on Computing.39 (5):2075–2089.CiteSeerX 10.1.1.153.6864.doi:10.1137/08071990x..

External links

[edit]
Wikimedia Commons has media related toFloyd-Warshall algorithm.
Graph andtree traversal algorithms
Search
Shortest path
Minimum spanning tree
Functions
Gradients
Convergence
Quasi–Newton
Other methods
Hessians
Graph of a strictly concave quadratic function with unique maximum.
Optimization computes maxima and minima.
General
Differentiable
Convex
minimization
Linear and
quadratic
Interior point
Basis-exchange
Paradigms
Graph
algorithms
Minimum
spanning tree
Shortest path
Network flows
Retrieved from "https://en.wikipedia.org/w/index.php?title=Floyd–Warshall_algorithm&oldid=1318399870"
Categories:
Hidden categories:

[8]ページ先頭

©2009-2025 Movatter.jp