Shortest Paths in a Graph (cont’d) Fundamental Algorithms 8a-ShortestPathsMore 1 All-Pairs Shortest Paths We now want to compute a table giving the length of the shortest path between any two vertices. (We also would like to get the shortest paths themselves.) We could just call Dijkstra or Bellman-Ford |V| times, passing a different source vertex each time. It can be done in (V3), which seems to be as good as you can do on dense graphs. 8a-ShortestPathsMore 2 Doing APSP with SSSP Dijkstra would take time (V V2) = (V3) (standard version) (V (VlgV + E)) = (V2lgV + VE)) (modified, Fibonacci heaps), but doesn’t work with negative-weight edges. Bellman-Ford would take (V VE) = (V2E). 8a-ShortestPathsMore 3 The Floyd-Warshall Algorithm Represent the directed, edge-weighted graph in adjacency-matrix form. W= matrix of weights = w11 w12 w13 w w w 21 22 23 w31 w32 w33 • wij is the weight of edge (i, j), or if there is no such edge. • Return a matrix D, where each entry dij is d(i,j). • Could also return a predecessor matrix, P, where each entry pij is the predecessor of j on the shortest path from8a-ShortestPathsMore i. 4 Floyd-Warshall: Idea Consider intermediate vertices of a path: i j Say we know the length of the shortest path from i to j whose intermediate vertices are only those with numbers 1, 2, ..., k-1. Call this length d ij( k 1) Now how can we extend this from k-1 to k? In other words, we want to compute d ij( k ) . Can we ( k 1) d use ij , and if so how? 8a-ShortestPathsMore 5 Floyd-Warshall Idea, 2 k i j Two possibilities: 1. Going through the vertex k doesn’t help— the path through vertices 1...k-1 is still the shortest. 2. There is a shorter path consisting of two subpaths, one from i to k and one from k to j. Each subpath passes only through vertices numbered 1 to k-1.8a-ShortestPathsMore 6 Floyd-Warshall Idea,3 Thus, (k) d ij min( d (ijk 1) , d (ikk 1) d (kjk 1)) Also, d (ij0 ) wij (since there are no intermediate vertices.) When k = |V|, we’re done. 8a-ShortestPathsMore 7 Dynamic Programming Floyd-Warshall is a dynamic programming algorithm: Compute and store solutions to subproblems. Combine those solutions to solve larger sub-problems. Here, the sub-problems involve finding the shortest paths through a subset of the vertices. 8a-ShortestPathsMore 8 Code for Floyd-Warshall Floyd-Warshall(W) 1 n rows[W ] // number of vertices 2 D(0) W 3 for k 1 to n 4 5 6 do for i 1 to n do for j 1 to n d (k ) ij min( d ( k 1) ij , d ( k 1) ik d ( k 1) kj ) 7 return D ( n ) Running time : a zippy (V 3 ). (Small constant of proportion ality, because operations are simple.) 8a-ShortestPathsMore 9 Example of Floyd-Warshall 8a-ShortestPathsMore 10 Johnson’s Algorithm Makes clever use of Bellman-Ford and Dijkstra to do All-Pairs-Shortest-Paths efficiently on sparse graphs. Motivation: By running Dijkstra |V| times, we could do APSP in time (V2lgV +VElgV) (Modified Dijkstra), or (V2lgV +VE) (Fibonacci Dijkstra). This beats (V3) (Floyd-Warshall) when the graph is sparse. Problem: negative edge weights. 8a-ShortestPathsMore 11 The Basic Idea Reweight the edges so that: 1. No edge weight is negative. 2. Shortest paths are preserved. (A shortest path in the original graph is still one in the new, reweighted graph.) An obvious attempt: subtract the minimum weight from all the edge weights. E.g. if the minimum weight is -2: -2 - -2 = 0 3 - -2 = 5 etc. 8a-ShortestPathsMore 12 Counterexample Subtracting the minimum weight from every weight doesn’t work. Consider: -2 -2 0 0 -1 1 Paths with more edges are unfairly penalized. 8a-ShortestPathsMore 13 Johnson’s Insight Add a vertex s to the original graph G, with edges of weight 0 to each vertex in G: 0 s 0 0 Assign new weights ŵ to each edge as follows: ŵ(u, v) = w(u, v) + d(s, u) - d(s, v) 8a-ShortestPathsMore 14 Question 1 Are all the ŵ’s non-negative? Yes: d (s, u) w(u, v) must be d (s, v) Otherwise, s u v would be shorter than the shortest path from s to v. u w(u, v) s v d ( s, u ) w(u, v) d ( s, v) Rewriting : w(u, v) d ( s, u ) d ( s, v) 0 wˆ (u , v) 8a-ShortestPathsMore 15 Question 2 Does the reweighting preserve shortest paths? Yes: Consider any path p v1 , v2 ,, vk wˆ ( p) k 1 wˆ (v , v i i 1 ) i 1 w(v1 , v2 ) d ( s, v1 ) d ( s, v2 ) d ( s , v2 ) d ( s , v 3 ) w( v2 , v3) the sum telescopes w(vk 1 , vk ) d ( s, vk 1 ) d ( s, vk ) w( p) d ( s, v1 ) d ( s, vk ) A value that depends only on the endpoints, not on the path. In other words, we have adjusted the lengths of all paths by the same amount. So this will not affect the relative ordering of the paths— 8a-ShortestPathsMore shortest paths will be preserved. 16 Question 3 How do we compute the d(s, v)’s? Use Bellman-Ford. This also tells us if we have a negative-weight cycle. 8a-ShortestPathsMore 17 Johnson’s: Algorithm 1. Compute G’, which consists of G augmented with s and a zero-weight edge from s to every vertex in G. 2. Run Bellman-Ford(G’, w, s) to obtain the d(s,v)’s 3. Reweight by computing ŵ for each edge 4. Run Dijkstra on each vertex to compute d̂ 5. Undo reweighting factors to compute d 8a-ShortestPathsMore 18 Johnson’s: CLRS 8a-ShortestPathsMore 19 Johnson: reweighting ŵ(u, v) = w(u, v) + d(s, u) - d(s, v) 8a-ShortestPathsMore 20 Johnson using Dijkstra 8a-ShortestPathsMore 21 Johnson’s: Running Time 1. Computing G’: (V) 2. Bellman-Ford: (VE) 3. Reweighting: (E) 4. Running (Modified) Dijkstra: (V2lgV +VElgV) 5. Adjusting distances: (V2) ————————————————————— Total is dominated by Dijkstra: (V2lgV +VElgV) 8a-ShortestPathsMore 22