理解最短路徑 迪傑斯特拉(dijkstra)演算法

2022-08-19 21:54:13 字數 1449 閱讀 6031

1.       迪傑斯特拉演算法簡介

迪傑斯特拉(dijkstra)演算法是典型的用來解決最短路徑的演算法,也是很多教程中的範例,由荷蘭計算機科學家狄克斯特拉於2023年提出,用來求得從起始點到其他所有點最短路徑。該演算法採用了貪心的思想,每次都查詢與該點距離最近的點,也因為這樣,它不能用來解決存在負權邊的圖。解決的問題大多是這樣的:有乙個無向圖g(v,e),邊e[i]的權值為w[i],找出v[0]到v[i]的最短路徑。

3.     迪傑斯特拉演算法的原理

①首先,引入乙個輔助向量d,它的每個分量d[i]表示當前所找到的 dijkstra演算法執行動畫過程 dijkstra演算法執行動畫過程 從起始點 (即源點 )到其它每個頂點 的長度。例如,d[3] = 2表示從起始點到頂點3的路徑相對最小長度為2。這裡強調相對就是說在演算法執行過程中d的值是在不斷逼近最終結果但在過程中不一定就等於長度。

②d的初始狀態為:若從v 到v[i]有弧(即從v到v[i]存在連線邊),則d[i]為弧上的權值(即為從v到v[i]的邊的權值);否則置d[i]為∞。顯然,長度為 d[j]= min 的路徑就是從v出發到頂點v[j]的長度最短的一條路徑,此路徑為(v,v[j])。

③那麼,下一條長度次短的是哪一條呢?也就是找到從源點v到下乙個頂點的最短路徑長度所對應的頂點,且這條最短路徑長度僅次於從源點v到頂點v[j]的最短路徑長度。 假設該次短路徑的終點是v[k],則可想而知,這條路徑要麼是(v,v[k]),或者是(v,v[j],v[k])。它的長度或者是從v到v[k]的弧上的權值,或者是d[j]加上從v[j]到v[k]的弧上的權值。

④一般情況下,假設s為已求得的從源點v出發的最短路徑長度的頂點的集合,則可證明:下一條次最短路徑(設其終點為x)要麼是弧(v,x),或者是從源點v出發的中間只經過s中的頂點而最後到達頂點 的路徑。 因此,下一條長度次短的的最短路徑長度必是d[j]= min,其中d 要麼是弧( v,v[i])上的權值,或者是d[i]( v[k]∈s)和弧(v[k] ,v[i] )上的權值之和。

3.     迪傑斯特拉演算法的實現過程

①先取一點v[0]作為起始點,初始化dis[i],d[i]的值為v[0]到其餘點v[i]的距離w[0][i],如果直接相鄰初始化為權值,否則初始化為無限大;

②將v[0]標記,vis[0] = 1(vis一開始初始化為0);

③找尋與v[0]相鄰的最近點v[k],將v[k]點記錄下來,v[k]與v[0]的距離記為min;

④把v[k]標記,vis[k]=1;

⑤查詢並比較,讓dis[j]與min+w[k][j]進行比較,判斷是直接v[0]連線v[j]短,還是經過v[k]連線v[j]更短,即dis[j]=min(dis[j],min+w[k][j]);

⑥繼續重複步驟③與步驟⑤,知道找出所有點為止。

4.    迪傑斯特拉的實現**(c/c++)

1

int dijkstra(intn)2

20return

dis[j];

21 }

迪傑斯特拉最短路徑

問題描述 在帶權有向圖g中,給定乙個源點v,求從v到g中的其餘各頂點的最短路徑問題,叫做單源點的最短路徑問題。在常用的單源點最短路徑演算法中,迪傑斯特拉演算法是最為常用的一種,是一種按照路徑長度遞增的次序產生最短路徑的演算法。在本題中,讀入乙個有向圖的帶權鄰接矩陣 即陣列表示 建立有向圖並按照以上描...

最短路 (迪傑斯特拉)

a 最短路 crawling in process.crawling failed time limit 1000msmemory limit 32768kb64bit io format i64d i64u submit status practice hdu 2544 description 在...

最短路徑 迪傑斯特拉演算法

例如,要求下圖v0到v8的最短路徑 所以我們可以找到這樣的一條最短路徑 下面是他的鄰接矩陣 偽 如下 define maxvex 9 define infinity 65535 typedef int patharc maxvex 用於儲存最短路徑下標的陣列 typedef int shortpat...