700 likes | 897 Views
Algorithms. Shortest Path Problems. G = (V, E) weighted directed graph w: E R weight function Weight of a path p = <v 0 , v 1 ,. . ., v n > Shortest path weight from u to v Shortest path from u to v: Any path from u to v with w(p) = (u,v) [v] predecessor of v on a path. .
E N D
Algorithms Shortest Path Problems
G = (V, E) weighted directed graph w: ER weight function Weight of a path p = <v0, v1,. . ., vn> Shortest path weight from u to v Shortest path from u to v: Any path from u to v with w(p) = (u,v) [v] predecessor of v on a path
Variants • Single-source shortest paths: find shortest paths from source vertex to every other vertex • Single-destination shortest paths: find shortest paths to a destination from every vertex • Single-pair shortest-path find shortest path from u to v • All pairs shortest paths
Lemma 25.1 • Subpaths of shortest paths are shortest paths. Given G=(G,E) w: E R Let p = p = <v1, v2,. . ., vk> be a shortest path from v1 to vk For any i,j such that 1 i j k, let pij be a subpath from vi to vj.. Then pij is a shortest path from vi to vj.
p 1 i j k
Corollary 25.2 Let G = (V,E) w: E R Suppose shortest path p from a source s to vertex v can be decomposed into p’ s u v for vertex u and path p’. Then weight of the shortest path from s to v is (s,v) = (s,u) + w(u,v)
Lemma 25.3 Let G = (V,E) w: E R Source vertex s For all edges (u,v)E (s,v) (s,u) + w(u,v)
u1 u2 u3 s v u4 un
Relaxation • Shortest path estimate d[v] is an attribute of each vertex which is an upper bound on the weight of the shortest path from s to v • Relaxation is the process of incrementally reducing d[v] until it is an exact weight of the shortest path from s to v
INITIALIZE-SINGLE-SOURCE(G, s) 1. for each vertex v V(G) 2. do d[v] 3. [v] nil 4. d[s] 0
Relaxing an Edge (u,v) • Question: Can we improve the shortest path to v found so far by going through u? • If yes, update d[v] and [v]
RELAX(u,v,w) 1. if d[v] > d[u] + w(u,v) 2. then d[v] d[u] + w(u,v) 3. [v] u
EXAMPLE 1 s s Relax v u v u
EXAMPLE 2 s s Relax v u v u
Dijkstra’s Algorithm • Problem: • Solve the single source shortest-path problem on a weighted, directed graph G(V,E) for the cases in which edge weights are non-negative
Dijkstra’s Algorithm • Approach • maintain a set S of vertices whose final shortest path weights from the source s have been determined. • repeat • select vertex from V-S with the minimum shortest path estimate • insert u in S • relax all edges leaving u
DIJKSTRA(G,w,s) 1. INITIALIZE-SINGLE-SOURCE(G,s) 2. S 3. Q V[G] 4. while Q 5. do u EXTRACT-MIN(Q) 6. S S {u} 7. for each vertex v Adj[u] 8. do RELAX(u,v,w)
Analysis of Dijkstra’s Algorithm • Suppose priority Q is: • an ordered (by d) linked list • Building the Q O(V lg V) • Each EXTRACT-MIN O(V) • This is done V times O(V2) • Each edge is relaxed one time O(E) • Total time O(V2 + E) = O(V2)
Analysis of Dijkstra’s Algorithm • Suppose priority Q is: • a binary heap • BUILD-HEAP O(V) • Each EXTRACT-MIN O(lg V) • This is done V times O(V lg V) • Each edge is relaxation O(lg V) • Each edge relaxed one time O(E lg V) • Total time O(Vlg V + E lg V))
Properties of Relaxation • Lemma 25.4 G=(V,E) w: E R (u,v) E After relaxing edge (u,v) by executing RELAX(u,v,w) we have d[v] d[u] + w(u,v)
Lemma 25.5 • Given: G=(V,E) w: E R source s V Graph initialized by INITIALIZE-SINGLE-SOURCE(G,s) • then d[v] (s,v) for all v V and this invariant is maintained over all relaxation steps Once d[v] achieves a lower bound (s,v), it never changes
Corollary 25.6 • Given: • G=(V,E) w: E R source s V • No path connects s to given v • then • after initialization • d[v] (s,v) • and this inequality is maintained over all relaxation steps.
Lemma 25.7 • Given: • G=(V,E) w: E R source s V • Let s - - u v be the shortest path in G for all vertices u and v. • Suppose G initialized by INITIALIZE-SINGLE-SOURCE is followed by a sequence of relaxations including RELAX(u,v,w) • Then d[u] = (s,u) prior to call implies that d[u] = (s,u) after the call
Bottom Line • Therefore, relaxation causes the shortest path estimates to descend monotonically toward the actual shortest-path weights.
Shortest-Paths Tree of G(V,E) • The shortest-paths tree at S of G(V,E) is a directed subgraph G’-(V’,E’), where V’ V, E’E, such that • V’ is the set of vertices reachable from S in G • G’ forms a rooted tree with root s, and • for all v V’, the unique simple path from s to v in G’ is a shortest path from s to v in G
Goal • We want to show that successive relaxations will yield a shortest-path tree
Lemma 25.8 • Given: • G=(V,E) w: E R source s V • Assume that G contains no negative-weight cycles reachable from s. • Then after the graph is initialized with INITIALIZE-SINGLE-SOURCE • • the predecessor subgraph G forms a rooted tree with root s, and • • any sequence of relaxation steps on edges in G maintains this property as an invariant.
Algorithms Bellman-Ford Algorithm Directed-Acyclic Graphs All Pairs-Shortest Path Algorithm
Why does Dijkstra’s greedy algorithm work? • Because we know that when we add a node u to the set S, the value d is the length of the shortest path from s to u. • But, this only works if the edges of the graph are nonnegative.
a 10 7 b c -4 Would Dikjstra’s Algorithm work with this graph?
a 6 7 b c -14 What is the length of the shortest path from a to c in this graph?
Bellman-Ford Algorithm • The Bellman-Ford algorithm can be used to solve the general single source shortest path problem • Negative weights are allowed • The algorithm detects negative cycles and returns false if the graph contains one.
BELLMAN-FORD(G,w,s) 1 INITIALIZE-SINGLE-SOURCE(G,s) 2 for i 1 to |V[G]| -1 3 do for each edge (u,v) E[G] 4 do RELAX(u,v,w) 5 for each edge (u,v) E[G] 6 do if d[v] > d[u] + w(u,v) 7 then return false 8 return true
When there are no cycles of negative length, what is maximum number of edges in a shortest path when the graph has |V[G]| vertices and |E[G]| edges?
Dynamic Programming Formulation • The following recurrence shows how the Bellman Ford algorithm computes the d values for paths of length k.
a 10 Processing order 1 2 3 (a,c) (b,a) (c,b) (c,d) (d,b) 7 b c -4 -5 9 d
Complexity of the Bellman Ford Algorithm • Time complexity: • Performance can be improved by • adding a test to the loop to see if any d values were updated on the previous iteration, or • maintain a queue of vertices whose d value changed on the previous iteration-only process these on the next iteration
Single-source shortest paths in directed acyclic graphs • Topological sorting is the key to efficient algorithms for many DAG applications. • A topological sort of a DAG is a linear ordering of all of its vertices such that if G contains an edge (u,v), then u appears before v in the ordering.
e g d f b c a a d c b e f g
DAG-SHORTEST-PATHS(G,w,s) 1 topologically sort the vertices of G 2 INITIALIZE-SINGLE-SOURCE(G,s) 3 for each vertex u taken in topological order 4 do for each vertex v Adj[u] 5 do RELAX(u,v,w)
Topological Sorting TOPOLOGICAL-SORT(G) 1 call DFS(G) to compute finishing times f[v] for each vertex v 2 as each vertex is finished, insert it onto the front of a linked list 3 return the linked list of vertices
Depth-first search • Goal: search all edges in the graph one time • Strategy: Search deeper in the graph whenever possible • Edges are explored out of the most recently discovered vertex v that still has unexplored edges leaving it. • Backtrack when a dead end is encountered
Predecessor subgraph • The predecessor subgraph of a depth first search • forms a depth-first forest • composed of depth-first trees • The edges in E are called tree edges
Vertex coloring scheme • All vertices are initially white • A vertex is colored gray when it is discovered • A vertex is colored black when it is finished (all vertices adjacent to the vertex have been examined completely)
Time Stamps • Each vertex v has two time-stamps • d[v] records when v is first discovered (and grayed) • f[v] records when the search finishes examining its adjacency list (and is blackened) • For every vertex u • d[u] < f[u]
Color and Time Stamp Summary • Vertex u is • white before d[u] • gray between d[u] and f[u] • black after f[u] • Time is a global variable in the pseudocode
DFS(G) 1 for each vertex u V[G] 2 do color[u] white 3 [u] nil 4 time 0 5 do for each vertex u Adj[u] 6 do if color[u] = white 7 then DFS-VISIT(u)