單源最短路徑

w39發表於2021-09-09

首先說下演算法原理:

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章