Dijkstra算法的過程、詳細步驟、代碼

目錄

一、算法思想

二、算法詳細步驟

三、僞代碼 + C++代碼

四、算法複雜度分析

五、算法改進

六、應用案例


一、算法思想

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]);
}

 

四、算法複雜度分析

 

五、算法改進

 

六、應用案例

 

未完,待續。。。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章