0% found this document useful (0 votes)
26 views

Shortest Path Algorithms

Quick run-through on popular shortest path algorithms - Djikstra's, Bellman Ford and Flyod-Warshall.

Uploaded by

Piyush Santwani
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
26 views

Shortest Path Algorithms

Quick run-through on popular shortest path algorithms - Djikstra's, Bellman Ford and Flyod-Warshall.

Uploaded by

Piyush Santwani
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 22

Shortest Path Problems: Dijkstra, Bellman-Ford,

and Floyd-Warshall
Duke COMPSCI 309s

Siyang Chen

Spring 2014

. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
General Graph Search

Let q be some sort of abstract queue object, which supports the


following two operations:
1. add, which adds a node into q
2. popFirst, which pops the ‘first’ node from q
Here the definition of ‘first’ depends on the specific queue
implementation.

. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
General Graph Search

Let q be some sort of abstract queue object, which supports the


following two operations:
1. add, which adds a node into q
2. popFirst, which pops the ‘first’ node from q
Here the definition of ‘first’ depends on the specific queue
implementation.
Then we can formulate all graph search algorithms in the following
manner:
▶ While q is not empty:
▶ v ← q.popFirst()
▶ For all neighbours u of v such that u ̸∈ q:
▶ Add u to q

. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
General Graph Search

▶ While q is not empty:


▶ v ← q.popFirst()
▶ For all neighbours u of v such that u ̸∈ q:
▶ Add u to q

By changing the behaviour of q, we recreate all the classical graph


search algorithms:

. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
General Graph Search

▶ While q is not empty:


▶ v ← q.popFirst()
▶ For all neighbours u of v such that u ̸∈ q:
▶ Add u to q

By changing the behaviour of q, we recreate all the classical graph


search algorithms:
▶ If q is a stack, then the algorithm becomes DFS.

. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
General Graph Search

▶ While q is not empty:


▶ v ← q.popFirst()
▶ For all neighbours u of v such that u ̸∈ q:
▶ Add u to q

By changing the behaviour of q, we recreate all the classical graph


search algorithms:
▶ If q is a stack, then the algorithm becomes DFS.
▶ If q is a standard FIFO queue, then the algorithm is BFS.

. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
General Graph Search

▶ While q is not empty:


▶ v ← q.popFirst()
▶ For all neighbours u of v such that u ̸∈ q:
▶ Add u to q

By changing the behaviour of q, we recreate all the classical graph


search algorithms:
▶ If q is a stack, then the algorithm becomes DFS.
▶ If q is a standard FIFO queue, then the algorithm is BFS.
▶ If q is a priority queue, then the algorithm is Dijkstra.

. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
General Graph Search

▶ While q is not empty:


▶ v ← q.popFirst()
▶ For all neighbours u of v such that u ̸∈ q:
▶ Add u to q

By changing the behaviour of q, we recreate all the classical graph


search algorithms:
▶ If q is a stack, then the algorithm becomes DFS.
▶ If q is a standard FIFO queue, then the algorithm is BFS.
▶ If q is a priority queue, then the algorithm is Dijkstra.
▶ If q is a priority queue with a heuristic, then the algorithm is
A*.

. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
General Graph Search

▶ While q is not empty:


▶ v ← q.popFirst()
▶ For all neighbours u of v such that u ̸∈ q:
▶ Add u to q

By changing the behaviour of q, we recreate all the classical graph


search algorithms:
▶ If q is a stack, then the algorithm becomes DFS.
▶ If q is a standard FIFO queue, then the algorithm is BFS.
▶ If q is a priority queue, then the algorithm is Dijkstra.
▶ If q is a priority queue with a heuristic, then the algorithm is
A*.
Today we’re going to focus on Dijkstra.

. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
Dijkstra’s Algorithm
Given a graph G = (V , E ) where edges have nonnegative lengths,
and a source node s ∈ V , Dijkstra’s algorithm finds the shortest
path from s to every other node.

. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
Dijkstra’s Algorithm
Given a graph G = (V , E ) where edges have nonnegative lengths,
and a source node s ∈ V , Dijkstra’s algorithm finds the shortest
path from s to every other node.
A standard implementation of Dijkstra’s algorithm is the following:

▶ For all v ∈ V , dv ← ∞
▶ ds ← 0
▶ q.add(s)
▶ While q is not empty:
▶ v ← q.popFirst()
▶ For all neighbours u of v , such that dv + e(v , u) ≤ du :
▶ q.remove(u)
▶ du ← dv + e(v , u)
▶ q.add(u)

. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
Dijkstra’s Algorithm
Given a graph G = (V , E ) where edges have nonnegative lengths,
and a source node s ∈ V , Dijkstra’s algorithm finds the shortest
path from s to every other node.
A standard implementation of Dijkstra’s algorithm is the following:

▶ For all v ∈ V , dv ← ∞
▶ ds ← 0
▶ q.add(s)
▶ While q is not empty:
▶ v ← q.popFirst()
▶ For all neighbours u of v , such that dv + e(v , u) ≤ du :
▶ q.remove(u)
▶ du ← dv + e(v , u)
▶ q.add(u)

Runtime?
. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
Dijkstra’s Algorithm
Given a graph G = (V , E ) where edges have nonnegative lengths,
and a source node s ∈ V , Dijkstra’s algorithm finds the shortest
path from s to every other node.
A standard implementation of Dijkstra’s algorithm is the following:

▶ For all v ∈ V , dv ← ∞
▶ ds ← 0
▶ q.add(s)
▶ While q is not empty:
▶ v ← q.popFirst()
▶ For all neighbours u of v , such that dv + e(v , u) ≤ du :
▶ q.remove(u)
▶ du ← dv + e(v , u)
▶ q.add(u)

Runtime? O(|E | + |V | log |V |)


. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
Dijkstra’s Algorithm
Given a graph G = (V , E ) where edges have nonnegative lengths,
and a source node s ∈ V , Dijkstra’s algorithm finds the shortest
path from s to every other node.
A standard implementation of Dijkstra’s algorithm is the following:

▶ For all v ∈ V , dv ← ∞
▶ ds ← 0
▶ q.add(s)
▶ While q is not empty:
▶ v ← q.popFirst()
▶ For all neighbours u of v , such that dv + e(v , u) ≤ du :
▶ q.remove(u)
▶ du ← dv + e(v , u)
▶ q.add(u)

Runtime? O(|E | + |V | log |V |)


We can also adapt the algorithm to store the shortest path itself.
. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
Bellman-Ford

In the case when the graph may have negative edges, we must use
the Bellman-Ford algorithm:
▶ For all v ∈ V , dv ← ∞
▶ ds ← 0
▶ For t ∈ {1, . . . , |V |}:
▶ For all edges (v , u):
▶ du ← min{du , dv + e(v , u)}
▶ If there is an edge (v , u) such that dv + e(v , u) < du :
▶ Throw NEGATIVE CYCLE FOUND

. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
Bellman-Ford

In the case when the graph may have negative edges, we must use
the Bellman-Ford algorithm:
▶ For all v ∈ V , dv ← ∞
▶ ds ← 0
▶ For t ∈ {1, . . . , |V |}:
▶ For all edges (v , u):
▶ du ← min{du , dv + e(v , u)}
▶ If there is an edge (v , u) such that dv + e(v , u) < du :
▶ Throw NEGATIVE CYCLE FOUND
Runtime?

. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
Bellman-Ford

In the case when the graph may have negative edges, we must use
the Bellman-Ford algorithm:
▶ For all v ∈ V , dv ← ∞
▶ ds ← 0
▶ For t ∈ {1, . . . , |V |}:
▶ For all edges (v , u):
▶ du ← min{du , dv + e(v , u)}
▶ If there is an edge (v , u) such that dv + e(v , u) < du :
▶ Throw NEGATIVE CYCLE FOUND
Runtime? O(|E | · |V |)

. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
Bellman-Ford

In the case when the graph may have negative edges, we must use
the Bellman-Ford algorithm:
▶ For all v ∈ V , dv ← ∞
▶ ds ← 0
▶ For t ∈ {1, . . . , |V |}:
▶ For all edges (v , u):
▶ du ← min{du , dv + e(v , u)}
▶ If there is an edge (v , u) such that dv + e(v , u) < du :
▶ Throw NEGATIVE CYCLE FOUND
Runtime? O(|E | · |V |)
One additional reason to use Bellman-Ford over Dijkstra is that it’s
much easier to implement.

. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
Floyd-Warshall

Lastly, suppose we want to find the shortest paths between each


pair of nodes in graph:
▶ For all v ∈ V , du,v ← ∞
▶ For all (u, v ) ∈ E , du,v ← e(u, v )
▶ For w ∈ {1, . . . , |V |}:
▶ For all pairs of nodes (u, v ):
▶ du,v ← min{du,v , du,w + dw ,v }

. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
Floyd-Warshall

Lastly, suppose we want to find the shortest paths between each


pair of nodes in graph:
▶ For all v ∈ V , du,v ← ∞
▶ For all (u, v ) ∈ E , du,v ← e(u, v )
▶ For w ∈ {1, . . . , |V |}:
▶ For all pairs of nodes (u, v ):
▶ du,v ← min{du,v , du,w + dw ,v }

Runtime?

. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
Floyd-Warshall

Lastly, suppose we want to find the shortest paths between each


pair of nodes in graph:
▶ For all v ∈ V , du,v ← ∞
▶ For all (u, v ) ∈ E , du,v ← e(u, v )
▶ For w ∈ {1, . . . , |V |}:
▶ For all pairs of nodes (u, v ):
▶ du,v ← min{du,v , du,w + dw ,v }

Runtime? O(|V |3 )

. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
Floyd-Warshall

Lastly, suppose we want to find the shortest paths between each


pair of nodes in graph:
▶ For all v ∈ V , du,v ← ∞
▶ For all (u, v ) ∈ E , du,v ← e(u, v )
▶ For w ∈ {1, . . . , |V |}:
▶ For all pairs of nodes (u, v ):
▶ du,v ← min{du,v , du,w + dw ,v }

Runtime? O(|V |3 )
Again, Floyd-Warshall is less efficient, but much easier to
implement than all-pairs Dijkstra.

. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..

You might also like