Shortest Paths CSE 2320 – Algorithms and Data Structures Vassilis Athitsos University of Texas at Arlington 1.

Slides:



Advertisements
Similar presentations
Graphs: MSTs and Shortest Paths David Kauchak cs161 Summer 2009.
Advertisements

 2004 SDU Lecture9- Single-Source Shortest Paths 1.Related Notions and Variants of Shortest Paths Problems 2.Properties of Shortest Paths and Relaxation.
CSE 101- Winter ‘15 Discussion Section January 26th 2015.
More Graph Algorithms Minimum Spanning Trees, Shortest Path Algorithms.
CSCI 3160 Design and Analysis of Algorithms Tutorial 2 Chengyu Lin.
Chapter 23 Minimum Spanning Trees
Tirgul 12 Algorithm for Single-Source-Shortest-Paths (s-s-s-p) Problem Application of s-s-s-p for Solving a System of Difference Constraints.
CPSC 411, Fall 2008: Set 9 1 CPSC 411 Design and Analysis of Algorithms Set 9: More Graph Algorithms Prof. Jennifer Welch Fall 2008.
CSE 780 Algorithms Advanced Algorithms Shortest path Shortest path tree Relaxation Bellman-Ford Alg.
Graph Algorithms: Minimum Spanning Tree We are given a weighted, undirected graph G = (V, E), with weight function w:
Lecture 19: Shortest Paths Shang-Hua Teng. Weighted Directed Graphs Weight on edges for distance
Jim Anderson Comp 122, Fall 2003 Single-source SPs - 1 Chapter 24: Single-Source Shortest Paths Given: A single source vertex in a weighted, directed graph.
Chapter 9 Graph algorithms. Sample Graph Problems Path problems. Connectedness problems. Spanning tree problems.
Greedy Algorithms Reading Material: Chapter 8 (Except Section 8.5)
Data Structures, Spring 2004 © L. Joskowicz 1 Data Structures – LECTURE 15 Shortest paths algorithms Properties of shortest paths Bellman-Ford algorithm.
Shortest Path Problems Directed weighted graph. Path length is sum of weights of edges on path. The vertex at which the path begins is the source vertex.
Chapter 9 Graph algorithms Lec 21 Dec 1, Sample Graph Problems Path problems. Connectedness problems. Spanning tree problems.
Shortest Path Algorithms
Tirgul 13. Unweighted Graphs Wishful Thinking – you decide to go to work on your sun-tan in ‘ Hatzuk ’ beach in Tel-Aviv. Therefore, you take your swimming.
Greedy Algorithms Like dynamic programming algorithms, greedy algorithms are usually designed to solve optimization problems Unlike dynamic programming.
More Graph Algorithms Weiss ch Exercise: MST idea from yesterday Alternative minimum spanning tree algorithm idea Idea: Look at smallest edge not.
Dijkstra’s Algorithm Slide Courtesy: Uwash, UT 1.
TECH Computer Science Graph Optimization Problems and Greedy Algorithms Greedy Algorithms  // Make the best choice now! Optimization Problems  Minimizing.
Dijkstra's algorithm.
Graphs – Shortest Path (Weighted Graph) ORD DFW SFO LAX
Shortest Path Algorithms. Kruskal’s Algorithm We construct a set of edges A satisfying the following invariant:  A is a subset of some MST We start with.
Nirmalya Roy School of Electrical Engineering and Computer Science Washington State University Cpt S 223 – Advanced Data Structures Graph Algorithms: Minimum.
1 Shortest Path Algorithms Andreas Klappenecker [based on slides by Prof. Welch]
Jim Anderson Comp 122, Fall 2003 Single-source SPs - 1 Chapter 24: Single-Source Shortest Paths Given: A single source vertex in a weighted, directed graph.
1 Shortest Path Problem Topic 11 ITS033 – Programming & Algorithms C B A E D F Asst. Prof. Dr. Bunyarit Uyyanonvara IT Program,
Dijkstras Algorithm Named after its discoverer, Dutch computer scientist Edsger Dijkstra, is an algorithm that solves the single-source shortest path problem.
Minimum Spanning Trees CSE 2320 – Algorithms and Data Structures Vassilis Athitsos University of Texas at Arlington 1.
Algorithm Course Dr. Aref Rashad February Algorithms Course..... Dr. Aref Rashad Part: 6 Shortest Path Algorithms.
Chapter 24: Single-Source Shortest Paths Given: A single source vertex in a weighted, directed graph. Want to compute a shortest path for each possible.
Shortest Path in Weighted Graph : Dijkstra’s Algorithm.
The single-source shortest path problem (SSSP) input: a graph G = (V, E) with edge weights, and a specific source node s. goal: find a minimum weight (shortest)
Minimum spanning trees (MST) Def: A spanning tree of a graph G is an acyclic subset of edges of G connecting all vertices in G. A sub-forest of G is an.
CSE 2331 / 5331 Topic 12: Shortest Path Basics Dijkstra Algorithm Relaxation Bellman-Ford Alg.
Shortest Path Algorithms. Definitions Variants  Single-source shortest-paths problem: Given a graph, finding a shortest path from a given source.
Data Structures & Algorithms Shortest Paths Richard Newman based on book by R. Sedgewick and slides by S. Sahni.
Weighted Graphs Computing 2 COMP s1 Sedgewick Part 5: Chapter
1 Prim’s algorithm. 2 Minimum Spanning Tree Given a weighted undirected graph G, find a tree T that spans all the vertices of G and minimizes the sum.
Lecture 13 Algorithm Analysis
IS 2610: Data Structures Graph April 12, Graph Weighted graph – call it networks Shortest path between nodes s and t in a network  Directed simple.
CSCE 411 Design and Analysis of Algorithms Set 9: More Graph Algorithms Prof. Jennifer Welch Spring 2012 CSCE 411, Spring 2012: Set 9 1.
Single Source Shortest Paths Chapter 24 CSc 4520/6520 Fall 2013 Slides adapted from George Bebis, University of Reno, Nevada.
Data Structures and Algorithm Analysis Graph Algorithms Lecturer: Jing Liu Homepage:
Minimum Spanning Trees CSE 2320 – Algorithms and Data Structures Vassilis Athitsos and Alexandra Stefan University of Texas at Arlington These slides are.
Proof of correctness of Dijkstra’s algorithm: Basically, we need to prove two claims. (1)Let S be the set of vertices for which the shortest path from.
1 GRAPHS – Definitions A graph G = (V, E) consists of –a set of vertices, V, and –a set of edges, E, where each edge is a pair (v,w) s.t. v,w  V Vertices.
CSE 373: Data Structures and Algorithms Lecture 21: Graphs V 1.
Minimum Spanning Trees
Minimum Spanning Trees
Shortest Paths and Minimum Spanning Trees
Single-Source Shortest Paths
Minimum Spanning Trees
Autumn 2016 Lecture 11 Minimum Spanning Trees (Part II)
Minimum-Cost Spanning Tree
Minimum Spanning Trees
Autumn 2015 Lecture 11 Minimum Spanning Trees (Part II)
Minimum-Cost Spanning Tree
Shortest Paths and Minimum Spanning Trees
Chapter 15 Graphs © 2006 Pearson Education Inc., Upper Saddle River, NJ. All rights reserved.
Fundamental Structures of Computer Science II
Algorithms: Design and Analysis
Single-Source Shortest Paths
Weighted Graphs & Shortest Paths
CSE 417: Algorithms and Computational Complexity
Chapter 9 Graph algorithms
Minimum-Cost Spanning Tree
Presentation transcript:

Shortest Paths CSE 2320 – Algorithms and Data Structures Vassilis Athitsos University of Texas at Arlington 1

Terminology A network is a directed graph. We will use both terms interchangeably. The weight of a path is the sum of weights of the edges that make up the path. The shortest path between two vertices s and t in a directed graph is a directed path from s to t with the property that no other such path has a lower weight. 2

Shortest Paths Finding shortest paths is not a single problem, but rather a family of problems. We will consider three of these problems, each of which is a generalization of the previous one: – Source-sink: find the shortest path from a source vertex v to a sink vertex w. – Single-source: find the shortest path from the source vertex v to all other vertices in the graph. It turns out that these shortest paths form a tree, with v as the root. – All-pairs: find the shortest paths for all pairs of vertices in the graph. 3

Assumptions Allow directed graphs. – In all our algorithms, we will allow graphs to be directed. – Obviously, any algorithm that works on directed graphs will also work on undirected graphs. Why? Negative edge weights are not allowed. Why? 4

Assumptions Allow directed graphs. – In all our algorithms, we will allow graphs to be directed. – Obviously, any algorithm that works on directed graphs will also work on undirected graphs. Why? Undirected graphs are a special case of directed graphs. Negative edge weights are not allowed. Why? – If we have negative weights, then "shortest paths" may not be defined. – If we can find a cyclic path with negative weight, then repeating that path infinitely will lead to "shorter" and "shorter" paths. – If all weights are nonnegative, a shortest path never needs to include a cycle. 5

Shortest-Paths Spanning Tree Given a network G and a designated vertex s, a shortest-paths spanning tree (SPST) for s is a tree that contains s and all vertices reachable from s, such that: – Vertex s is the root of this tree. – Each tree path is a shortest path in G. 6

Computing SPSTs To compute an SPST, given a graph G and a vertex s, we will design an algorithm that maintains and updates the following two arrays: – Array wt: wt[v] is the weight of the shortest path we have found so far from s to v. At the beginning, wt[v] = infinity, except for s, where wt[s] = 0. – Array st: st[v] is the parent vertex of v on the shortest path found so far from s to v. At the beginning, st[v] = -1, except for s, where st[s] = s. – Array in: in[v] is 1 if v has been already added to the SPST, 0 otherwise. At the beginning, in[v] = 0, except for s, where in[s] = 1. 7

Dijkstra's Algorithm Computes an SPST for a graph G and a source s. Like Prim's algorithm, but: – First vertex to add is the source. – Works with directed graphs, whereas Prim's only works with undirected graphs. -Requires edge weights to be non-negative. Time: O(V 2 ), similar analysis to that of Prim's algorithm. Time O(E lg V) using a priority-queue implementation. 8

Dijkstra's Algorithm Input: number of vertices V, VxV array weight, source vertex s. 1.For all v: 2.wt[v] = infinity. 3.st[v] = in[v] = 0. 5.wt[s] = 0, st[s] = 0. 6.Repeat until all vertices have been added to the tree: 7.Find the v with the smallest wt[v], among all v such that in[v] = 0. 8.Add to the SPST vertex v and edge from st[v] to v. 9.in[v] = For each neighbor w of v, such that in[w] = 0: 11.If wt[w] > wt[v] + weight[v, w]: 12.wt[w] = wt[v] + weight[v, w], 13.st[w] = v. 9

Edge Relaxation if (wt[w] > wt[v] + e.wt) { wt[w] = wt[v] + e.wt; st[w] = v; } wt[w]: current estimate of shortest distance from source to w. st[w]: parent vertex of w on shortest found path from source to w. 10

Dijkstra Example Suppose we want to compute the SPST for vertex 7. First, we initialize arrays wt, st, in (steps 2, 3, 4) vertex wtinf st in

Dijkstra Example Suppose we want to compute the SPST for vertex 7. Step vertex wtinf 0 st 7 in

Dijkstra Example Suppose we want to compute the SPST for vertex 7. Steps 7, 8, 9: v = vertex wtinf 0 st 7 in

Dijkstra Example Suppose we want to compute the SPST for vertex 7. Steps 7, 8, 9: v = 7 Step 10: For w = {0, 4} – Step 11: Compare inf with 15 – Steps 12, 13: wt[0] = wt[7] + 15, st[0] = vertex wt15 inf 0 st7 7 in

Dijkstra Example Suppose we want to compute the SPST for vertex 7. Steps 7, 8, 9: v = 7 Step 10: For w = {0, 4} – Step 11: Compare inf with 10 – Steps 12, 13: wt[4] = wt[7] + 10, st[4] = vertex wt15 inf 10inf 0 st7 7 7 in

Dijkstra Example Suppose we want to compute the SPST for vertex 7. Steps 7, 8, 9: v = vertex wt15 inf 10inf 0 st7 7 7 in

Dijkstra Example Suppose we want to compute the SPST for vertex 7. Steps 7, 8, 9: v = 4 Step 10: For w = {3, 5, 6} – Step 11: Compare inf with 10+25=35 – Steps 12, 13: wt[3] = wt[4] + 25, st[3] = vertex wt15 inf 3510inf 0 st in

Dijkstra Example Suppose we want to compute the SPST for vertex 7. Steps 7, 8, 9: v = 4 Step 10: For w = {3, 5, 6} – Step 11: Compare inf with 10+20=30 – Steps 12, 13: wt[5] = wt[4] + 20, st[5] = vertex wt15 inf inf0 st in

Dijkstra Example Suppose we want to compute the SPST for vertex 7. Steps 7, 8, 9: v = 4 Step 10: For w = {3, 5, 6} – Step 11: Compare inf with 10+30=40 – Steps 12, 13: wt[6] = wt[4] + 30, st[6] = vertex wt15 inf st in

Dijkstra Example Suppose we want to compute the SPST for vertex 7. Steps 7, 8, 9: v = vertex wt15 inf st in

Dijkstra Example Suppose we want to compute the SPST for vertex 7. Steps 7, 8, 9: v = 0 Step 10: For w = {1, 2, 5, 6} – Step 11: Compare inf with 15+20=35 – Steps 12, 13: wt[1] = wt[0] + 20, st[1] = vertex wt15 35inf st in

Dijkstra Example Suppose we want to compute the SPST for vertex 7. Steps 7, 8, 9: v = 0 Step 10: For w = {1, 2, 5, 6} – Step 11: Compare inf with 15+30=45 – Steps 12, 13: wt[2] = wt[0] + 30, st[2] = vertex wt st in

Dijkstra Example Suppose we want to compute the SPST for vertex 7. Steps 7, 8, 9: v = 0 Step 10: For w = {1, 2, 5, 6} – Step 11: Compare 30 with 15+10=25 – Steps 12, 13: wt[5] = wt[0] + 10, st[5] = vertex wt st in

Dijkstra Example Suppose we want to compute the SPST for vertex 7. Steps 7, 8, 9: v = 0 Step 10: For w = {1, 2, 5, 6} – Step 11: Compare 40 with 15+20=35 – Steps 12, 13: wt[6] = wt[0] + 20, st[6] = vertex wt st in

Dijkstra Example Suppose we want to compute the SPST for vertex 7. Steps 7, 8, 9: v = vertex wt st in

Dijkstra Example Suppose we want to compute the SPST for vertex 7. Steps 7, 8, 9: v = 5 Step 10: For w = {3} – Step 11: Compare 35 with 25+15=40 NO UPDATE vertex wt st in

Dijkstra Example Suppose we want to compute the SPST for vertex 7. Steps 7, 8, 9: v = 1 Step 10: For w = empty list vertex wt st in

Dijkstra Example Suppose we want to compute the SPST for vertex 7. Steps 7, 8, 9: v = 3 Step 10: For w = empty list vertex wt st in

Dijkstra Example Suppose we want to compute the SPST for vertex 7. Steps 7, 8, 9: v = 6 Step 10: For w = empty list vertex wt st in

Dijkstra Example Suppose we want to compute the SPST for vertex 7. Steps 7, 8, 9: v = 6 Step 10: For w = empty list vertex wt st in

Dijkstra Example Suppose we want to compute the SPST for vertex 4. First, we initialize arrays wt, st, in (steps 2, 3, 4) vertex wtinf st in

Dijkstra Example Suppose we want to compute the SPST for vertex 4. Step vertex wtinf 0 st 4 in

Dijkstra Example Suppose we want to compute the SPST for vertex 4. Steps 7, 8, 9: v = vertex wtinf 0 st 4 in

Dijkstra Example Suppose we want to compute the SPST for vertex 4. Steps 7, 8, 9: v = 4 Step 10: For w = {3, 5, 6, 7} – Step 11: Compare inf with 25 – Steps 12, 13: wt[3] = wt[4] + 25, st[3] = vertex wtinf 250inf st 44 in

Dijkstra Example Suppose we want to compute the SPST for vertex 4. Steps 7, 8, 9: v = 4 Step 10: For w = {3, 5, 6, 7} – Steps 12, 13: update wt[w], st[w] vertex wtinf st in

Dijkstra Example Suppose we want to compute the SPST for vertex 4. Steps 7, 8, 9: v = 7 36 vertex wtinf st in

Dijkstra Example Suppose we want to compute the SPST for vertex 4. Steps 7, 8, 9: v = 7 Step 10: For w = {0} – Step 11: Compare inf with = 25. – Steps 12, 13: wt[0] = wt[7] + 15, st[0] = vertex wt25 inf st in

Dijkstra Example Suppose we want to compute the SPST for vertex 4. Steps 7, 8, 9: v = 5 38 vertex wt25 inf st in

Dijkstra Example Suppose we want to compute the SPST for vertex 4. Steps 7, 8, 9: v = 5 Step 10: For w = {0, 3} – Step 11: Compare 25 with = 25. NO UPDATE 39 vertex wt25 inf st in

Dijkstra Example Suppose we want to compute the SPST for vertex 4. Steps 7, 8, 9: v = 5 Step 10: For w = {0, 3} – Step 11: Compare 25 with = 35. NO UPDATE 40 vertex wt25 inf st in

Dijkstra Example Suppose we want to compute the SPST for vertex 4. Steps 7, 8, 9: v = 0 41 vertex wt25 inf st in

Dijkstra Example Suppose we want to compute the SPST for vertex 4. Steps 7, 8, 9: v = 0 Step 10: For w = {1, 2, 6} – Step 11: Compare inf with = 45. – Steps 12, 13: wt[1] = wt[0] + 20, st[1] = vertex wt25 45inf st in

Dijkstra Example Suppose we want to compute the SPST for vertex 4. Steps 7, 8, 9: v = 0 Step 10: For w = {1, 2, 6} – Step 11: Compare inf with = 55. – Steps 12, 13: wt[2] = wt[0] + 30, st[2] = vertex wt st in

Dijkstra Example Suppose we want to compute the SPST for vertex 4. Steps 7, 8, 9: v = 0 Step 10: For w = {1, 2, 6} – Step 11: Compare 30 with = 45. NO UPDATE 44 vertex wt st in

Dijkstra Example Suppose we want to compute the SPST for vertex 4. Steps 7, 8, 9: v = 3 45 vertex wt st in

Dijkstra Example Suppose we want to compute the SPST for vertex 4. Steps 7, 8, 9: v = 3 Step 10: empty list 46 vertex wt st in

Dijkstra Example Suppose we want to compute the SPST for vertex 4. Steps 7, 8, 9: v = 6 Step 10: empty list 47 vertex wt st in

Dijkstra Example Suppose we want to compute the SPST for vertex 4. Steps 7, 8, 9: v = 1 Step 10: empty list 48 vertex wt st in

Dijkstra Example Suppose we want to compute the SPST for vertex 4. Steps 7, 8, 9: v = 2 Step 10: empty list 49 vertex wt st in

All-Pairs Shortest Paths Before we describe an algorithm for computing the shortest paths among all pairs of vertices, we should agree on what this algorithm should return. We need to compute two V x V arrays: – dist[v][w] is the distance of the shortest path from v to w. – path[v][w] is the vertex following v, on the shortest path from v to w. Given these two arrays (after our algorithm has completed), how can we recover the shortest path between some v and w? 50

All-Pairs Shortest Paths We need to compute two V x V arrays: – dist[v][w] is the distance of the shortest path from v to w. – path[v][w] is the vertex following v, on the shortest path from v to w. Given these two arrays (after our algorithm has completed), how can we recover the shortest path between some v and w? path = empty list c = v while(true) – insert_to_end(path, c) – if (c == w) break – c = path[c][w] 51

Computing Shortest Paths Overview: we can simply call Dijkstra's algorithm on each vertex. Time: V times the time of running Dijkstra's algorithm once. – O(E lg V) for one vertex. – O(VE lg V) for all vertices. – O(V 3 lg V) for dense graphs. There is a better algorithm for dense graphs, Floyd's algorithm, with O(V 3 ) complexity, but we will not cover it. 52

All-Pairs Shortest Paths Using Dijkstra The complete all-pairs algorithm is more complicated than simply calling Dijkstra's algorithm V times. Here is why: Suppose we call Dijkstra's algorithm on vertex 1. The algorithm computes arrays wt and st: – wt[v]: weight of shortest path from source to v. – st[v]: parent vertex of v on shortest path from source to v. How do arrays wt and st correspond to arrays dist and path? – dist[v][w] is the distance of the shortest path from v to w. – path[v][w] is the vertex following v, on the shortest path from v to w. No useful correspondence!!!

Using Reverse Graphs Suppose that G is the graph you see on the right. Suppose that H is the reverse graph, obtained by switching the direction of every single edge in G Graph G Graph H

Using Reverse Graphs Suppose that G is the graph you see on the right. Suppose that H is the reverse graph, obtained by switching the direction of every single edge in G. Then, for any vertices v and w, the shortest path from w to v in H is simply the reverse of the shortest path from v to w in G. For example: – Shortest path from 1 to 7 in G: – Shortest path from 7 to 1 in H:

Using Reverse Graphs Suppose that G is the graph you see on the right. Suppose that H is the reverse graph, obtained by switching the direction of every single edge in G. Then, for any vertices v and w, the shortest path from w to v in H is simply the reverse of the shortest path from v to w in G. For example: – Shortest path from 1 to 7 in G: 1, 0, 7, 4 – Shortest path from 7 to 1 in H: 4, 7, 0, 1. – These two paths are just reversed forms of each other, and they have the same weights

Using Reverse Graphs Suppose that we call Dijkstra's algorithm with source = vertex 1, on graph H (the reverse graph of what you see on the right). Consider the arrays wt and st we get as a result of that. These arrays are related to arrays dist and path on the original graph G (what you actually see on the right) as follows: – dist[v][1] = wt[v]. – path[v][1] = st[v]. Why?

Using Reverse Graphs Suppose that we call Dijkstra's algorithm with source = vertex 1, on graph H (the reverse graph of what you see on the right). Consider the arrays wt and st we get as a result of that. wt[v] is the weight of the shortest path from 1 to v in H. – Therefore, wt[v] is the weight of the shortest path from v to 1 in G. – Therefore, dist[v][1] = wt[v]. st[v] is the parent of v on the shortest path from 1 to v in H. – Therefore, st[v] is the vertex following v on the shortest path from v to 1 in G. – Therefore, path[v][1] = st[v]

Using Reverse Graphs Suppose that we call Dijkstra's algorithm with source = vertex 1, on graph H (the reverse graph of what you see on the right). Consider the arrays wt and st we get as a result of that. wt[v] is the weight of the shortest path from 1 to v in H. – Therefore, wt[v] is the weight of the shortest path from v to 1 in G. – Therefore, dist[v][1] = wt[v]. st[v] is the parent of v on the shortest path from 1 to v in H. – Therefore, st[v] is the vertex following v on the shortest path from v to 1 in G. – Therefore, path[v][1] = st[v]

Using Dijkstra's Algorithm for All- Pairs Shortest Paths Input: graph G. 1.Construct reverse graph H. 2.For each s in {0,..., V-1}: 3.Call Dijkstra's algorithm on graph H, with source = s. 4.For each v in {0,..., V-1}: 5.dist[v][s] = wt[v]. 6.path[v][s] = st[v]. 60