單源最短路徑
首先說下演算法原理:
1,設0為源點,建立兩個集合S,T,S儲存節點0,T集合儲存節點1,2,3,4。(S,T是官方定義名稱,個人理解S應該是source的縮寫,T是target的縮寫,看了英文是不是就明白點了)
2,先找出0到其他點最短的點,0到1等於10,即0-1為最短。那麼將1新增進S,將1從T中刪除。
3,修正路徑,這是個難點,怎麼修改呢,我舉最簡單的例子,那就是直接在圖上修改。修正路徑要修正的是0到其他節點的路徑長度,先看下圖,
0-1=10
0-2=正無窮,因為0直接到不了2
0-3=30
0-4=100
當我們在S集合中增加了節點1,那麼0到其他節點的方式就多了一個,比如0-2,就不在是正無窮,他可以透過1到達,所以0-2=60
那麼0-4=100,當0透過1在到達4,結果是0-1-4=10加正無窮,因為1到達不了4,所以10+正無窮就大於100,所以0-4還是100,0-3同理,10+正無窮>30,因此0-3還是30。
1新增進集合S後,在新增次短的節點,因為1是最短的,新增完最短的新增次短的。
現在是0到各節點的路徑是:
0-1=10
0-2=60
0-3=30
0-4=100
這裡0-3是最短的,因此S集合新增節點3,同樣移除T中,3。
新增完3後,再修正路徑,因為1已經新增過了所以不在修改1。那麼新增2,0-2在上面已經被修正成60了,現在看0-3-2,它等50,小於60,所以0-2再次修正,等於50。0-3不修正,因為是當前選則的路徑。接著修改0-4,0-4初始等於100,現在0-3-4等於160,大於100,所以0-4仍然等於100
0-1=10
0-2=50
0-3=30
0-4=100
接著再找最短的,1,3已經選過了,現在最短的是2,0-2=50,透過2在修正,13已經選過不在修正,只修正4,即0-2-4=60(具體流向是0-3-2-4),小於0-4=100,因此修正0-4=60。
最後將4從T中取出新增進S,因為123都已經使用,4不在修正,方法結束,即T為空就結束。
那麼0到各點的最短路徑為
0-1=10
0-2=50
0-3=30
0-4=60
![圖片描述][1]
將上面的演算法寫成程式碼如下:
但在學習程式碼前,首先要理解陣列weight是什麼,陣列weight翻譯出來是
第一行 {0,3,2000,7,9999999}
A——>A 寬度(權值)0 自己到自己自然是0
A——>B 寬度(權值)3
A——>C 寬度(權值)2000
A——>D 寬度(權值)7
A——>E 寬度(權值)9999999即無限大,即 到達不了E
第二行 {3,0,4,2,9999999},
B——>A 寬度(權值)3
B——>B 寬度(權值)0 B-B
B——>C 寬度(權值)4
B——>D 寬度(權值)2
B——>E 寬度(權值)9999999 即無限大,即到達不了E
第三行 {9999999,4,0,5,6},
C——>A 寬度(權值)9999999 即無限大 ,即 到達不了A
C——>B 寬度(權值)4
C——>C 寬度(權值)0 C-C
C——>D 寬度(權值)5
C——>E 寬度(權值)6
第四行 {7,2,5,0,4},
D——>A 寬度(權值)7
D——>B 寬度(權值)2
D——>C 寬度(權值)5
D——>D 寬度(權值)0 D-D
D——>E 寬度(權值)4
第五行 {9999999,9999999,4,6,0}
E——>A 寬度(權值)9999999即無限大,即 到達不了A
E——>B 寬度(權值)9999999即無限大,即 到達不了B
E——>C 寬度(權值)4
E——>D 寬度(權值)6
E——>E 寬度(權值)0 E-E
以下為C#程式碼 可以執行
public class Dijkstra
{
public static void Excute()
{
int[][] weight = new int[][]
{
new int[] {0,3,2000,7,9999999},
new int[] {3,0,4,2,9999999},
new int[] {9999999,4,0,5,6},
new int[] {7,2,5,0,4},
new int[] {9999999,9999999,4,6,0}
};
int[] path = Dijsktra(weight, 0);
for (int i = 0; i
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/854/viewspace-2803356/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 單源最短路徑:最短路徑性質的證明
- 單源最短路徑-Dijkstra演算法演算法
- 0016:單源最短路徑(dijkstra演算法)演算法
- 單源最短路徑(single-source shortest path )
- P4779 【模板】單源最短路徑(標準版)
- 單源最短路問題
- BFS求無權圖的單源最短路徑-鄰接矩陣儲存矩陣
- 6.4.2最短路徑
- 圖 - 最短路徑
- 多源最短路徑演算法:Floyd演算法演算法
- HDU - 3790 (雙標準限制最短路徑)最短路徑問題
- 最短路徑問題
- 最短路:求最長最短路
- 最短路 || 最長路 || 次短路
- 多源最短路徑,一文搞懂Floyd演算法演算法
- QOJ #8673. 最短路徑
- 最短路徑演算法演算法
- 最短路徑(dijkstra 與 Floyd)
- 迷宮的最短路徑
- 矩陣求最短路徑矩陣
- 圖的最短路徑(Dijkstra | Floyd)
- 最短路徑(Floyd演算法)演算法
- 最短路徑(Dijskra演算法)JS演算法
- Djikstra最短路徑演算法演算法
- bellman-ford 單源最短路問題 圖解圖解
- 2024_4_22 路徑花費為最長$k$條邊之和最短路
- [MATLAB]最短路徑Floyd演算法Matlab演算法
- 最短路徑演算法總結演算法
- 最短路徑之Floyd演算法演算法
- 最短路徑之Dijkstra演算法演算法
- Johnson全源最短路
- Johnson 全源最短路
- 獲取所有鑰匙的最短路徑
- Floyd演算法(計算最短路徑)演算法
- PAT A 1030. Travel Plan (30)【最短路徑】
- 動態規劃之最短路徑和動態規劃
- 最短路徑問題 (dijkstra演算法)演算法
- 幾個最短路徑的演算法演算法