Johnson`s algorithm範例

advertisement
Floyd-Warshall
algorithm
95360794 康峻岳
All-pairs shortest paths
• Input: Digraph G = (V, E), where |V| = n,
with edge-weight function w : E → R.
• Output: n × n matrix of shortest-path
lengths
δ(i, j) for all i, j ∈ V.
Floyd-Warshall algorithm
Define cij(k) = weight of a shortest path from
i to j with intermediate vertices
belonging to the set {1, 2, …, k}
Thus, δ(i, j) = cij(n). Also, cij(0) = aij
Floyd-Warshall recurrence
• cij (k) = mink {cij(k–1), cik(k–1) + ckj(k–1)}
intermediate vertices in {1, 2, …, k}
Pseudocode for FloydWarshall
• for k ← 1 to n
do for i ← 1 to n
do for j ← 1 to n
do if cij > cik + ckj
then cij ← cik + ckj
Time Complexity: O(n3)
任意兩節點最短路徑
Johnson’s algorithm
1. Find a vertex labeling h such that ŵ(u, v) ≥ 0 for all
(u, v) ∈ E by using Bellman-Ford to solve the difference
constraints
h(v) – h(u) ≤ w(u, v),
or determine that a negative-weight cycle exists.
• Time = O(VE).
2. Run Dijkstra’s algorithm from each vertex using ŵ.
• Time = O(VE + V2 lg V).
3. Reweight each shortest-path length ŵ(p) to produce
the shortest-path lengths w(p) of the original graph.
• Time = O(V2).
Total time = O(VE + V2 lg V)
Johnson’s algorithm
• Johnson’s演算法利用Reweighing來除去負邊,使得該
圖可以套用Dijkstra演算法,來達到較高的效能。
• Reweighing是將每個點v設定一個高度h(v),並且調整
邊的weight function w(u,v)成為w’(u,v)=w(u,v)+h(u)h(v)。
• 令δ‘(u,v)如此調整之後的最短距離,則原先的最短距離
δ(u,v)=δ‘(u,v)-h(u)+h(v)。
Johnson’s algorithm範例
4
3
7
8
1
-4
-5
2
6
9
Johnson’s algorithm範例
0
0
s
0
0
加入一個點s,
以及自s拉一條
weight為0的邊
到每一點。
4
3
7
8
1
-4
-5
2
6
0
10
Johnson’s algorithm範例
0
-1
0
4
3
s
0
0
7
8
0
-5
1
-4
-5
執行BellmanFord演算法,
得到自s出發每
一點的最短距
離。
2
-4
6
0
0
11
Johnson’s algorithm範例
-1
0
做完
reweighting
0
4
10
13
-5
0
0
0
2
-4
2
0
12
Johnson’s algorithm範例
2/1
0
4
0/0
10
13
2/-3
0
0
2
0/-4
2
0
紅線部分是Shortestpaths tree。
點的數字a/b代表自出發
點(綠色點)出發,到達
該點的最短路徑
(Reweighting後的圖/原
圖)。
2/0
13
Johnson’s algorithm範例
0/0
0
4
2/3
10
13
0/-4
0
0
0
2
2/-1
2
0/1
14
Johnson’s algorithm範例
0/4
0
4
2/7
10
13
0/0
0
0
0
2
2/3
2
0/5
15
Johnson’s algorithm範例
0/-1
0
4
2/2
10
13
0/-5
0
0
0
2
2/-2
2
0/0
16
Johnson’s algorithm範例
2/5
0
4
4/8
10
13
2/1
0
0
0
2
0/0
2
2/6
17
Johnson’s algorithm複雜度分析
• 執行一次Bellman-Ford。O(|V||E|)。
• 執行|V|次Dijkstra。
– 使用Fibonacci heap,總計
O(|V|2log|V|+|V||E|) 。
– 使用Binary heap,總計O(|V||E|log|V|)。
• 當|E|足夠小,比Floyd-Warshall快。
18
資料來源及參考網站
• http://www.csie.nctu.edu.tw/~sctsai/algo/n
otes/
• http://tinyurl.com/cglkn6
• http://www.csie.ntnu.edu.tw/~u91029/inde
x.html
Download