9.3 – Dijkstra's Algorithm - Used to solve the single-source shortest paths problem for weighted connected graphs → Start at a vertex designated as the source → Find shortest paths to all other vertices - Some uses for this problem: i. Transportation planning ii. Packet routing of communication networks iii. Searching social networks iv. Speech Recognition Dijkstra's Algorithm - Applies to directed and undirected graphs with non negative weights only - Finds shortest paths to all vertices in order of distance from the source vertex. → The weights of the edges in the graph are used as measure of distance - A sub-tree of the graph is made based on the vertices already visited by the algorithm. - The set of vertices that are adjacent to the current sub-tree are called “fringe vertices” → candidates the algorithm will choose the next element from Dijkstra's Algorithm - To determine the next closest vertex → a) For every fringe vertex, compute distance to nearest vertex 'v' of the sub-tree → b) Then, add the length of the shortest distance from the source vertex to 'v' to the value obtained in (a) → c) Fringe vertex with the lowest computed sum becomes the next Required Data - Each vertex 'v' should hold two values → d – the shortest distance from the source node to vertex 'v' → a link to the parent node of the current vertex 'v' - Once a fringe node 'u' has been identified as the next node in the tree → Move node 'u' from the fringe vertex list to the set of tree vertices → For all remaining fringe nodes adjacent to node 'u' calculate if the distance from the source node to 'u' + the distance from 'u' to the fringe node is less than the current distance associated with the fringe node. If it is, replace the current distance with the new distance The Algorithm ALGORITHM Dijkstra(G, s) //Dijkstra’s algorithm for single-source shortest paths //Input: A weighted connected graph G = V, E with non-negative weights // and its vertex s //Output: The length dv of a shortest path from s to v // and its penultimate vertex pv for every vertex v in V Initialize(Q) //initialize priority queue to empty for every vertex v in V dv ←∞; pv ←null Insert(Q, v, dv) //initialize vertex priority in the priority queue ds ←0; Decrease(Q, s, ds) //update priority of s with ds VT←∅ for i ←0 to |V| − 1 do u∗ ←DeleteMin(Q) //delete the minimum priority element VT ←VT ∪ {u∗} for every vertex u in V − VT that is adjacent to u∗ do If du∗ + w(u∗, u) < du du ←du∗ + w(u∗, u); pu←u∗ Decrease(Q, u, du) Efficiency For graphs represented by their weight matrix and the priority queue implemented as an unordered array, it is in Θ(|V |2) For graphs represented by their adjacency lists and the priority queue implemented as a min-heap, it is in O(|E| log |V |)