目錄
一、算法思想
Dijkstra算法本質上是一個貪心算法,其基本思想是:設置一個頂點集合S並不斷地做貪心選擇來擴充這個集合。
該算法適用:邊權爲正、有向無向都適用。
二、算法詳細步驟
假設:
1)已知帶權圖G = (V,E)。
2)一個頂點屬於S當且僅當從源到該頂點的最短路徑長度已知。
3) d爲記錄當前每個頂點所對應的最短特殊路徑長度。
1、S中初始時僅包含源
2、從V - S中選取最短特殊路徑長度最短的頂點,並將其加入S
3、對數組d進行更新(更新條件:若通過該頂點到某個頂點的路徑比原先d數組保存的小)
三、僞代碼 + C++代碼
1、僞代碼
清除所有點的標號
設d[0] = 0, 其他d[i] = INF
循環n次 {
在所有未標號結點中,選出d值最小的結點x
給結點x標記
對於從x出發的所有邊(x,y),更新d[y] = min{d[y], d[y]+w(x, y)}
}
2、C++實現代碼
memset(v, o, sizeof(v));
for(int i = 0; i < n; i++) d[i] = (i==0 ? 0 : INF);
for(int i = 0; i < n; i++) {
int x, m = INF;
for(int y = 0; y < n; y++) if(!v[y] && d[y]<=m) m = d[x=y];
v[x] = 1;
for(int y = 0; y < n; y++) d[y] = min(d[y], d[x] + w[x][y]);
}
四、算法複雜度分析
五、算法改進
六、應用案例
未完,待續。。。