shortest path

30
Shortest path

Upload: mareo

Post on 23-Feb-2016

85 views

Category:

Documents


0 download

DESCRIPTION

Shortest path. Graph with Length. Dijkstra’s Algorithm. Edge with Length. 3. 4. Distance / time / resource ,etc. 4. 10. 3. 2. 2. Pattaya. Finding Shortest Path. BFS can give us the shortest path Just convert the length edge into unit edge. 2. B. D. B. D. 2. A. 2. A. 1. 3. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Shortest path

Shortest path

Page 2: Shortest path

GRAPH WITH LENGTHDijkstra’s Algorithm

Page 3: Shortest path

Edge with Length

Distance / time / resource ,etc..

Pattaya

4

3

2

10

4

3

2

Page 4: Shortest path

Finding Shortest Path

• BFS can give us the shortest path• Just convert the length edge into unit edge

However, this is very slowImagine a case when the length is 1,000,000

A

B D

EC

A

B D

EC

2

1

1 3

2

4

2

Page 5: Shortest path

Alarm Clock Analogy No need to walk to every node

Since it won’t change anything

We skip to the “actual” node Set up the clock at alarm at the

target node

S

A

B

100

50

200

S

A

B

Page 6: Shortest path

Alarm Clock Algorithm

• Set an alarm clock for node s at time 0.• Repeat until there are no more alarms:– Say the next alarm goes off at time T, for node u.

Then:• The distance from s to u is T.• For each neighbor v of u in G:

– If there is no alarm yet for v set one for time T + w(u, v).– If v's alarm is set for later than T + w(u, v), then reset it to

this earlier time.

Page 7: Shortest path

Dijkstra’s Algo from BFSprocedure dijkstra(G, w, s)//Input: Graph G = (V,E), directed or undirected; vertex s V; positive edge lengths w// Output: For all vertices u reachable from s, dist[u] is setto the distance from s to u.

for all v V dist[v] = + prev[v] = nil

dist[s] = 0Priority_Queue H = makequeue(V) // enqueue all vertices (using dist as keys)while H is not empty v = H.deletemin() for each edge (v,u) E if dist[u] > dist[v] + w(v, u) dist[u] = dist[v] + w(v, u) prev[u] = v H.decreasekey(v,dist[v]) // change the value of v to dist[v]

Page 8: Shortest path

Another Implementation of Dijkstra’s

• Growing from Known Region of shortest path

• Given a graph and a starting node s– What if we know a shortest path from s to some

subset S’ V?

• Divide and Conquer Approach?

Page 9: Shortest path

Dijktra’s Algo #2procedure dijkstra(G, w, s)//Input: Graph G = (V,E), directed or undirected; vertex s V; positive edge lengths w// Output: For all vertices u reachable from s, dist[u] is setto the distance from s to u.

for all u V : dist[u] = + prev[u] = nil

dist[s] = 0

R = {} // (the “known region”)while R ≠ V : Pick the node v R with smallest dist[] Add v to R for all edges (v,u) E: if dist[u] > dist[v] + w(v,u) dist[u] = dist[v] + w(v,u) prev[u] = v

Page 10: Shortest path

Analysis

• There are |V| ExtractMin• Need to check all edges– At most |E|, if we use adjacency list– Maybe |V2|, if we use adjacency matrix– Value of dist[] might be changed

• Depends on underlying data structure

Page 11: Shortest path

Choice of DS

• Using simple array– Each ExtractMin uses O(V)– Each change of dist[] uses O(1)– Result = O(V2 + E) = O(V2)

• Using binary heap– Each ExtractMin uses O(lg V)– Each change of dist[] uses O(lg V)– Result = O( (V + E) lg V)• Beware!!! Can be O (V2 lg V) • if the graph is not sparse

Might be V2

Good when the graph is

sparse

Page 12: Shortest path

Fibonacci Heap

• Using Fibonacci Heap– Each ExtractMin uses O( lg V) (amortized)– Each change of dist[] uses O(1) (amortized)– Result = O(V lg V + E)

Page 13: Shortest path

Graph with Negative Edge

• Disjktra’s works because a shortest path to v must pass through a node closer than v

• Shortest path to A pass through B which is… in BFS sense… is further than A

S

A

B

3

4

-2

Page 14: Shortest path

Negative Cycle

• A graph with a negative cycle has no shortest path– The shortest.. makes no sense..

• Hence, negative edge must be a directed

Page 15: Shortest path

Key Idea in Shortest Path

• Update the distance

if (dist[z] > dist[v] + w(v,z)) dist[z] = dist[v] + w(v,z)

• This is safe to perform

Page 16: Shortest path

Another Approach to Shortest Path

• A shortest path must has at most |V| - 1 edges• Writing a recurrent• d(n, v) = shortest distance from s to v using at

most n edges• d(n,v) = min of – d(n – 1, v)– min( d(n – 1, u) + w(u,v) ) over all edges (u,v)

• Initial d(*,s) = 0, d(0,v) =

Page 17: Shortest path

Bellman-Ford Algorithm

• Dynamic Programming• Since d(n,*) use d(n – 1,*), we use only 1D

array to store D

Page 18: Shortest path

Bellman-Ford Algorithmprocedure BellmanFord(G, w, s)//Input: Graph G = (V,E), directed; vertex s V; edge lengths w (may be negative), no negative cycle// Output: For all vertices u reachable from s, dist[u] is setto the distance from s to u.

for all u V : dist[u] = + prev[u] = nil

dist[s] = 0

repeat |V| - 1 times: for all edges (a,b) E: if dist[b] > dist[a] + w(a,b) dist[b] = dist[a] + w(a,b) prev[b] = a

Page 19: Shortest path

Analysis

• Very simple• Loop |V| times• Each loop takes |E| iterations

• O(V E)– Dense graph O(V3)

• Bellman-Ford is slower but can detect negative cycle

Page 20: Shortest path

Detecting Negative Cycle

• After repeat the loop |V|-1 times• If we can still do– dist[v] = dist[u] + w(y,v)

• Then, there is a negative cycle– Because there is a shorter path eventhough we

have repeat this |V|-1 time

for all edges (a,b) E if dist[b] > dist[a] + w(a,b) printf(“negative cycle\n”)

Page 21: Shortest path

Shortest Path in DAG• Path in DAG appears in linearized order

procedure dag-shortest-path(G, w, s)//Input: DAG G = (V,E), vertex s V; edge lengths w (may be negative)// Output: For all vertices u reachable from s, dist[u] is setto the distance from s to u.

for all u V dist[u] = + prev[u] = nil

dist[s] = 0Linearize GFor each u V , in linearized order: for all edges (u,v) E: if dist[v] > dist[u] + w(u,v) dist[v] = dist[u] + w(y,v) prev[b] = a

Page 22: Shortest path

ALL PAIR SHORTEST PATH

Page 23: Shortest path

All Pair Shortest Path Problem

• Input:– A graph

• Output:– A matrix D[1..v,1..v] giving the shortest distance

between every pair of vertices

Page 24: Shortest path

Approach

• Standard shortest path gives shortest path from a given vertex s to every vertex– Repeat this for every starting vertex s– Dijkstra O(|V| * (|E| log |V|) )– Bellman-Ford O(|V| * (|V|3) )

• Dynamic Algorithm Approach– Floyd-Warshall

Page 25: Shortest path

Dynamic Algorithm Approach

• Using the previous recurrent– d(n, v) = shortest distance from s to v using at most

n edges– Change to • dn(a,b) = shortest distance from a to b using at most n

edges

• dn(a,b) = min of – dn-1(a,b)

– min(dn-1(a,k) + w(k,b) ) over all edges (k,b)

• Initial d0(a,a) = 0, d0 (a,b) = , d1(a,b) = w(a,b)

Page 26: Shortest path

Dynamic Algorithm Approach

• Again, A shortest path must has at most |V| - 1 edges

• What we need to find is d|V|(a,b)

• Let D{M} be the matrix dm(a,b)

• Start with D{1} and compute D{2}

– Similar to computation of dist[] in Bellman-Ford– Repeat until we have D{|V|}

Page 27: Shortest path

Floyd-Warshall

• Use another recurrent• dk(a,b) is a shortest distance from a to b that

can travel via a set of vertex {1,2,3,…,k}• d0(a,b) = l(a,b) because it can not go pass

any vertex• d1(a,b) means a shortest distance that the

path can have only vertex 1 (not including a and b)

Page 28: Shortest path

Recurrent Relation

• dk(a,b) = min of – dk-1(a,b)

– dk-1(a,k) + dk-1 (k,b)

• Initial d0(a,b) = l(a,b)

Page 29: Shortest path

Floyd-Warshall procedure FloydWarshall(G, l)//Input: Graph G = (V,E); vertex s V; edge lengths w (may be negative), no negative cycle// Output: dist[u,v] is the shortest distance from u to v.

dist = w

for k = 0 to |V| - 1 for i = 0 to |V| - 1 for j = 0 to |V| - 1 dist[i][j] = min (dist[i][j], dist[i][k] + dist[k][j])

Page 30: Shortest path

Analysis

• Very simple• 3 nested loops of |V|• O(|V|3)