pptx - HKOI

advertisement
Graph (II)
Shortest path, Minimum spanning tree
GGuy
19-3-2011
Review
DFS (Depth-First-Search)
Graph traverse
Topological sort
BFS (Breadth-First-Search)
Finding shortest path
Shortest Path Problem
In a weighted graph G
We want to find a path from s to t,
such that the sum of edge weight is minimum
Shortest Path
S
3
2
1
3
3
1
T
3
Shortest Path
S
3
2
1
3
3
1
T
3
Algorithms
Single source?
All pairs?
Negative weight edge?
Negative cycles?
Dijkstra’s algorithm
for-each v, d[v] ← ∞
Q.Insert(s,0)
while not Q.Empty() do
(u, w) = Q.ExtractMin()
if (visited[u]) continue;
d[u] ← w
for-each v where (u, v) in E
Q.Insert(v, d[u] + weightuv)
Dijkstra’s algorithm
S
3
2
1
3
3
1
T
3
Dijkstra’s algorithm
0
3
2
1
3
3
1
T
3
Dijkstra’s algorithm
0
3
2
1
3
3
T
2
1
3
Dijkstra’s algorithm
0
3
2
1
3
3
T
2
1
3
Dijkstra’s algorithm
0
3
3
2
1
3
3
T
2
1
3
Dijkstra’s algorithm
0
3
3
2
1
3
3
T
2
1
3
Dijkstra’s algorithm
0
3
3
2
1
3
3
T
2
3
1
3
Dijkstra’s algorithm
0
3
3
2
1
3
3
T
2
3
1
3
Dijkstra’s algorithm
0
3
3
2
1
3
3
T
2
3
1
3
Dijkstra’s algorithm
0
3
3
2
1
3
3
4
2
3
1
3
Dijkstra’s algorithm
0
3
3
2
1
3
3
4
2
3
1
3
Dijkstra’s algorithm
0
3
3
2
1
3
3
4
2
3
1
3
Dijkstra’s algorithm
Implement Q using binary heap (priority queue)
At most E edges in the heap
Time complexity: O(E log (E)) = O(E log (V))
Space complexity: O(V+E)
Bellman Ford
for-each v, d[v] ← ∞
d[s] ← 0
Do V-1 times
for each edge (u,v)
if (d[u] + weightuv < d[v])
d[v] ← d[u] + weightuv
Bellman Ford’s algorithm
S
3
2
1
4
3
1
T
-2
Bellman Ford’s algorithm
S
3
3
2
1
4
3
T
2
-2
1
4
Bellman Ford’s algorithm
S
3
3
2
1
4
3
2
2
-2
1
3
Bellman Ford’s algorithm
S
3
3
2
1
4
3
1
2
-2
1
3
Bellman Ford’s algorithm
Assume the shortest path from s->t is
P0 P1 P2 … Pm-1
where m < |V| and s is fixed
In the 1st iteration, d[P1] is shortest
In the 2nd iteration, d[P2] is shortest
…
In the m-1 iteration, d[Pm-1] is shortest
Bellman Ford’s algorithm
After |V|-1 iterations,
If there exists edge (u,v) where
d[u] + weightuv < d[v]
Negative cycle!
Bellman Ford’s algorithm
Time complexity: O(VE)
Space complexity: O(V)
Floyd Warshall’s algorithm
for all pairs(i,j), d[i][j] ← ∞
for all edges(u,v), d[u][v] ← weightuv
for k=1 to V
for i=1 to V
for j=1 to V
d[i][j] =
min(d[i][j], d[i][k]+d[k][j])
Floyd Warshall’s algorithm
Assume the shortest path from s->t is
P0 P1 P2 … Pm-1
for any s,t
For example, 5->3->1->2->4->6
i=1:
i=2:
i=3:
i=4:
i=5:
i=6:
5->1->6
5->1->2->6
5->3->1->2->6
5->3->1->2->4->6
5->3->1->2->4->6
5->3->1->2->4->6
We won’t miss
any shortest path!
Floyd Warshall’s algorithm
Time complexity: O(V3)
Space complexity: O(V2)
Summary
Negative edges? Negative cycle? Time complexity
Dijkstra
Single source
No
No
O(E log V)
Bellman Ford
Single source
Yes
Yes
O(VE)
Floyd Warshall
All pairs
Yes
Maybe
(modified)
O(V3)
Tree
What is a tree?
G is connected and acyclic
G is connected and |E| = |V| - 1
G is acyclic and |E| = |V| - 1
For any pairs in G, there is a unique path
Spanning Tree
3
2
1
3
3
1
3
Minimum Spanning Tree
3
2
1
3
3
1
3
Kruskal’s algorithm
T ← empty set of edges
Sort the edges in increasing order
For each edge e (in increasing order)
if T + e does not contain a cycle
add e to T
Kruskal’s algorithm
How to detect a cycle?
Disjoint Set
Kruskal’s algorithm
If we choose an edge (u,v)
Union(u, v)
Kruskal’s algorithm
3
2
1
2
2
1
2
Kruskal’s algorithm
3
2
1
2
2
1
2
Kruskal’s algorithm
3
2
1
2
2
1
2
Kruskal’s algorithm
3
2
1
2
2
1
2
Kruskal’s algorithm
3
2
1
2
2
1
2
Kruskal’s algorithm
3
2
1
2
2
1
2
Kruskal’s algorithm
3
2
1
2
2
1
2
Kruskal’s algorithm
3
2
1
2
2
1
2
Krustal’s algorithm
Sorting: O(E log V)
Select edge: O(E)
Check union: O(α(V))
Overall: O(E log V + E α(V))
The Red Rule
The Red Rule states that for any cycle in G, the
largest weight edge will NOT be contained in
any Minimum Spanning Tree.
Prim’s algorithm
T ← node 1
while size of T < V
choose a vertex u that is not in V
and the cost adding it to V is
minimum
add u to V
Prim’s algorithm
3
2
1
2
2
1
2
Prim’s algorithm
3
2
1
2
2
1
2
Prim’s algorithm
3
2
1
2
2
1
2
Prim’s algorithm
3
2
1
2
2
1
2
Prim’s algorithm
3
2
1
2
2
1
2
Prim’s algorithm
Use a min heap to maintain
Dijkstra like implement
Time complexity: O(E log V)
Download