最短路徑 Dijkstar演算法

2021-10-03 19:35:07 字數 2685 閱讀 5756

dijkstar演算法理解:

dijkstar演算法的核心思想就是通過一次一次的迭代,逐個尋找起始頂點到圖中每乙個頂點的最短路徑,並在確定乙個頂點的最短路徑之後,設定標誌位,同時根據最新確定的頂點的最短路徑,對其他與之相關頂點的最短路徑進行修正和更新。

根據上圖可以列寫出該連通網的鄰接矩陣,為了方便直觀的理解:

權值v0

v1v2

v3v4

v5v6

v7v8v00

15ꚙꚙ

ꚙꚙꚙꚙ

v1103

75ꚙꚙ

ꚙꚙv25

30ꚙ1

7ꚙꚙꚙ

v3ꚙ7ꚙ

02ꚙ3

ꚙꚙv4ꚙ

5120

369ꚙ

v5ꚙꚙ7

ꚙ30ꚙ

5ꚙv6ꚙ

ꚙꚙ36

ꚙ027

v7ꚙꚙꚙ

ꚙ952

04v8ꚙ

ꚙꚙꚙꚙ

ꚙ740

演算法流程:(敘述過程中用d陣列表示各點最短路徑的權值和陣列,用p陣列表示最短路徑的下標陣列)

演算法流程和最下方的演算法**結合在一起看,方便理解。

1、第乙個迴圈

d陣列初始化時幅值為鄰接矩陣中v0(起始頂點)行。v0頂點預設已經確定了最短路徑。

第乙個for迴圈,首先在未確定最短路徑的所有頂點中尋找與v0直接相連,且權值最小的頂點,得到k = 1(k儲存前驅頂點);min = 1(min儲存到達前驅頂點的最短路徑權值和),在這個for迴圈中,找到的這個頂點可以直接確定找到了最短路徑(因為每次在第二個for迴圈中,都進行了對於其他未確定最短路徑的頂點的路徑優化)。

第二個for迴圈對於路徑進行優化,優化原則為:如果 【到達前驅頂點的權值和(即min)+ 前驅頂點到達其他未確定最短路徑的頂點的權值 < 當前d陣列中達到該頂點的權值和 】則說明當前到達該頂點的路徑不夠優化,此時即可採用經過當前前驅頂點到達那個頂點的路徑替換之前的路徑,即同時更新p陣列,將當前的k中儲存的前驅頂點作為那個頂點的前驅。

d陣列v0

v1v2

v3v4

v5v6

v7v8

k=1,min=101

5ꚙꚙꚙ

ꚙꚙꚙ優化路徑01

486ꚙ

ꚙꚙꚙp陣列

v0v1

v2v3

v4v5

v6v7

v8k=1 優化00

1110

0002、第二個迴圈

相同的原理進行一次迭代,結果如下(注意自己過流程的時候,對照上面的鄰接矩陣):

d陣列v0

v1v2

v3v4

v5v6

v7v8

k=2,min=401

486ꚙ

ꚙꚙꚙ優化路徑01

48511

ꚙꚙꚙp陣列

v0v1

v2v3

v4v5

v6v7

v8k=2 優化00

1122

0003、第三個迴圈

相同的原理進行一次迭代,結果如下:

d陣列v0

v1v2

v3v4

v5v6

v7v8

k=4,min=501

48511

ꚙꚙꚙ優化路徑01

4758

1114

ꚙp陣列

v0v1

v2v3

v4v5

v6v7

v8k=4 優化00

1424

440......如此迴圈n次(n為頂點數),即可已得到最短路徑,結果如下:

結果v0

v1v2

v3v4

v5v6

v7v8

d陣列014

75810

1216

p陣列001

4243

67final陣列11

1111

111根據d陣列可以得到從起始點到達任何乙個頂點的最短路徑權值和,根據p陣列可以得到每乙個頂點的最短路徑中的前驅頂點,進而可以連線生成最短路徑,該例題中到達v8的最短路徑為:

**如下:

#define maxvex 	9

#define infinity 65535

/* 用來儲存最短路徑下標的陣列 */

typedef int patharc[maxvex];

/* 用來儲存到各點最短路徑的權值和 */

typedef int shortpathtable[maxvex];

void shortestpath_dijkstar(mgragh g,int v0,patharc *p,shortpathtable *d)

{ int v,w,k,min;

/* final[w] = 1表示已經求得頂點vo到vw的最短路徑 */

int final[maxvex];

/* init */

for(v=0;v——cloud over sky

——2020/3/12

最短路徑演算法 最短路

在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?input 輸入包括多組資料。每組資料第一行是兩個整數n m n 100,m 10000 n...

最短路徑演算法

floyd演算法 012345 001 54 1108 1 2 801 3 3 1035 45 302 5413520 floyd 演算法過程描述如下 首先 以邊集 初始化,得到所有的直接連通代價 依次考慮第 k個結點,對於 中的每乙個 i j 判斷是否滿足 s i j s i k s k j 如果...

最短路徑演算法

個人覺得下面 有代表性 最短路徑演算法原始碼 vb 本人載 開發gis,遊自編的最短路徑查詢程式,速度特快,3萬節點,35000條路全部遍歷,只需1秒。現將最短路徑的思路告訴大家,希望大家在優化,並用不同語言編制,我正在學delphi,準備用delphi做成庫,本例以由拓撲關係的arc info 檔...