天天看點

Dijkstra 單源最短路徑算法

Dijkstra 單源最短路徑算法
Dijkstra 單源最短路徑算法

Dijkstra 算法描述:

建立源頂點 v 到圖中所有頂點的距離的集合 distSet,為圖中的所有頂點指定一個距離值,初始均為 Infinite,源頂點距離為 0;

建立 SPT(Shortest Path Tree)集合 sptSet,用于存放包含在 SPT 中的頂點;

如果 sptSet 中并沒有包含所有的頂點,則:

選中不包含在 sptSet 中的頂點 u,u 為目前 sptSet 中未确認的最短距離頂點;

将 u 包含進 sptSet;

更新 u 的所有鄰接頂點的距離值;

僞碼實作如下:

Dijkstra 單源最短路徑算法
Dijkstra 單源最短路徑算法

例如,下面是一個包含 9 個頂點的圖,每條邊分别辨別了距離。

Dijkstra 單源最短路徑算法

源頂點 source = 0,初始時,

sptSet = {false, false, false, false, false, false, false, false, false};

distSet = {0, INF, INF, INF, INF, INF, INF, INF, INF};

将 0 包含至 sptSet 中;

sptSet = {true, false, false, false, false, false, false, false, false};

更新 0 至其鄰接節點的距離;

distSet = {0, 4, INF, INF, INF, INF, INF, 8, INF};

Dijkstra 單源最短路徑算法

選擇不在 sptSet 中的 Min Distance 的頂點,為頂點 1,則将 1 包含至 sptSet;

sptSet = {true, true, false, false, false, false, false, false, false};

更新 1 至其鄰接節點的距離;

distSet = {0, 4, 12, INF, INF, INF, INF, 8, INF};

Dijkstra 單源最短路徑算法

選擇不在 sptSet 中的 Min Distance 的頂點,為頂點 7,則将 7 包含至 sptSet;

sptSet = {true, true, false, false, false, false, false, true, false};

更新 7 至其鄰接節點的距離;

distSet = {0, 4, 12, INF, INF, INF, 9, 8, 15};

Dijkstra 單源最短路徑算法

選擇不在 sptSet 中的 Min Distance 的頂點,為頂點 6,則将 6 包含至 sptSet;

sptSet = {true, true, false, false, false, false, true, true, false};

更新 6 至其鄰接節點的距離;

distSet = {0, 4, 12, INF, INF, 11, 9, 8, 15};

Dijkstra 單源最短路徑算法

以此類推,直到周遊結束。

sptSet = {true, true, true, true, true, true, true, true, true};

distSet = {0, 4, 12, 19, 21, 11, 9, 8, 14};

Dijkstra 單源最短路徑算法

最終結果為源頂點 0 至所有頂點的距離:

Dijkstra 單源最短路徑算法
Dijkstra 單源最短路徑算法

C#代碼實作:

Dijkstra 單源最短路徑算法
Dijkstra 單源最短路徑算法

<a href="http://www.cnblogs.com/gaochundong/p/breadth_first_search.html" target="_blank">廣度優先搜尋</a>

<a href="http://en.wikipedia.org/wiki/Dijkstra" target="_blank">Dijkstra's algorithm</a>

<a href="http://www.geeksforgeeks.org/greedy-algorithms-set-6-dijkstras-shortest-path-algorithm/" target="_blank">Greedy Algorithms | Set 7 (Dijkstra’s shortest path algorithm)</a>

<a href="http://www.cnblogs.com/gaochundong/p/bellman_ford_algorithm.html" target="_blank">Bellman-Ford 單源最短路徑算法</a>

<a href="http://courses.csail.mit.edu/6.006/spring11/lectures/lec16.pdf" target="_blank">Introduction to Algorithms 6.006 - Lecture 16</a>

本文轉自匠心十年部落格園部落格,原文連結:http://www.cnblogs.com/gaochundong/p/dijkstra_algorithm.html,如需轉載請自行聯系原作者

繼續閱讀