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 檔...