单源最短路径Dijkstra算法的思想、详细步骤、代码
目錄
一、算法思想
二、算法詳細(xì)步驟
三、偽代碼 + C++代碼
四、算法復(fù)雜度分析
五、算法改進(jìn)
六、應(yīng)用案例
一、算法思想
1、Dijkstra 算法是用來(lái)求解單源最短路徑問(wèn)題的經(jīng)典算法,其本質(zhì)上是一個(gè)貪心算法。
? ?(PS: 求任意兩個(gè)結(jié)點(diǎn)之間最短路徑的有 Floyd 算法)
2、算法的基本思想是:設(shè)置一個(gè)頂點(diǎn)集合 S?并不斷地做貪心選擇來(lái)擴(kuò)充這個(gè)集合。
3、該算法適用:1)邊權(quán)為正,2)有向無(wú)向都適用。
有一些相關(guān)的性質(zhì):
?
二、算法詳細(xì)步驟
假設(shè):
? ? ? ? 1)已知帶權(quán)圖 G = (V, E)
? ? ? ?-?V: 頂點(diǎn)(Vertex)的集合
? ? ? ?-?E: 邊(Edge)的集合
? ? ? ? ? ? ? ? ? ? ? -?邊 e = (u, v), u??V, v??V
? ? ? ? 2)一個(gè)頂點(diǎn)屬于S當(dāng)且僅當(dāng)從源到該頂點(diǎn)的最短路徑長(zhǎng)度已知。
? ? ? ? 3)? 數(shù)據(jù)結(jié)構(gòu):數(shù)組d,為記錄當(dāng)前每個(gè)頂點(diǎn)所對(duì)應(yīng)的最短特殊路徑長(zhǎng)度(源v0到該頂點(diǎn))。
算法步驟:
1、S 中初始時(shí)僅包含源 v0
2、從頂點(diǎn)集合 { V - S } 中選取最短特殊路徑長(zhǎng)度最短的頂點(diǎn),并將其加入 S
3、對(duì)數(shù)組 d 進(jìn)行更新(更新條件:若源 v0 通過(guò)某個(gè)頂點(diǎn)到該頂點(diǎn)的路徑比原先 d 數(shù)組保存的小)
?
三、偽代碼 + C++代碼
1、偽代碼
清除所有點(diǎn)的標(biāo)號(hào) // 屬于集合S的標(biāo)記 設(shè)d[0] = 0, 其他d[i] = INF // initial 循環(huán)n次 {在所有未標(biāo)號(hào)結(jié)點(diǎn)中,選出d值最小的結(jié)點(diǎn)x // 從{V - S}中選出從源出發(fā)距離最短的頂點(diǎn)給結(jié)點(diǎn)x標(biāo)記 // 加入集合S對(duì)于從x出發(fā)的所有邊(x,y),更新d[y] = min{d[y], d[y]+w(x, y)}? // 更新所有x的出邊頂點(diǎn) }??
2、C++代碼實(shí)現(xiàn)
memset(v, 0, 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]); }?
四、算法復(fù)雜度分析
?
五、算法改進(jìn)
?
六、應(yīng)用案例
?
更新:2021年5月3日
未完,待續(xù)。。。
?
?
總結(jié)
以上是生活随笔為你收集整理的单源最短路径Dijkstra算法的思想、详细步骤、代码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 音响设备与生命健康
- 下一篇: 夺命雷公狗—玩转SEO---20---K