CSCE 411 Lecture 20

From Notes
Jump to navigation Jump to search
Lecture Slides

« previous | Friday, October 12, 2012 | next »


Shortest Paths

Weighted Graph (no negative weights)

If all weights are same, BFS would give shortest path.

Algorithm makes use of a priority queue

Dijkstra's Single Source Shortest Path Algorithm

  • Assume all edge weights are nonnegative
  • Similar to Prim's MST algorithm (greedily choose the lightest edge)
  1. Keep an estimate of the shortest path distance from to
  2. Use as the key in a priority queue
  3. When is added to the tree, check each of 's neighbors to see if provides with a cheaper path from : compare to
def dijkstra_sssp graph, source

  pq = PriorityQueue.new
  graph.each_vertex do |v|
    v.distance = Float::INFINITY
    pq.insert v.distance, v
  end
  source.distance = 0

  until pq.empty?
    u = pq.extract_min
    u.neighbors.each do |v|
      if u.distance + graph.weight(u,v) < v.distance
        v.distance = u.distance + graph.weight(u,v)
        pq.decrease_key(v, v.distance)
        v.parent = u
      end
    end
  end
end

Correctness

Let be the tree constructed after the th iteration of the while loop:

  • The nodes in are not in
  • The edges in are indicated by their parent variables


Claim. The pathi n from to is a shortest path and has a distance for all

Proof by induction.
Basis: When , is the only node in and .

Induction: Assume is a correct shortest path tree. We need to show that is a correct shortest path tree as well.

Let be the node added in iteration . Let . We need to show that the path in from to is a shortest path, and has distance .

Let be another path from to . Let be the first edge in that leaves .

If is the part before and is the part after , then

* represents the shortest path, and provides a lower bound for (any path from to ).

Therefore, , and the claim holds by induction on .

Q.E.D.

Running Time

Basic running time:

using binary heap
using Fibonacci heap
, ,