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

2022-06-06 06:21:10 字數 2661 閱讀 3953

最短路徑問題是圖論研究中的乙個經典演算法問題,旨在尋找圖(由結點和路徑組成的)中兩結點之間的最短路徑,大致可以分為如下幾種問題,可無論如何分類問題,其本質思想還是不變的,即,求兩點間的最短距離。

a) 確定起點的最短路徑問題 - 即已知起始結點,求最短路徑的問題。

b) 確定終點的最短路徑問題 - 與確定起點的問題相反,該問題是已知終結結點,求最短路徑的問題。在無向圖中該問題與確定起點的問題完全等同,在有向圖中該問題等同於把所有路徑方向反轉的確定起點的問題。

c) 確定起點終點的最短路徑問題 - 即已知起點和終點,求兩結點之間的最短路徑。

d) 全域性最短路徑問題 - 求圖中所有的最短路徑。

如上圖,迪傑斯特拉演算法的核心思路是:

1) 指定乙個節點,例如我們要計算 'a' 到其他節點的最短路徑

2) 引入兩個集合(s、u),s集合包含已求出的最短路徑的點(以及相應的最短長度),u集合包含未求出最短路徑的點(以及a到該點的路徑,注意 如上圖所示,a->c由於沒有直接相連 初始時為∞)

3) 初始化兩個集合,s集合初始時 只有當前要計算的節點,a->a = 0,

4) u集合初始時為 a->b = 4, a->c = ∞, a->d = 2, a->e = ∞

5) 從u集合中找出路徑最短的點,加入s集合,例如 a->d = 2

6) 更新u集合路徑,if ( 'd 到 b,c,e 的距離' + 'ad 距離' < 'a 到 b,c,e 的距離' ) 則更新u

7) 迴圈執行 4、5 兩步驟,直至遍歷結束,得到a 到其他節點的最短路徑

#include #include 

#include

using

namespace

std;

#define infinity 65535//

無邊時的權值

#define max_vertex_num 10//

最大頂點數

typedef

struct

mgraph mgraph;

int locatevex(mgraph g, string u)

void createdn(mgraph &g) }

//迪傑斯特拉演算法求有向網g的v0頂點到其餘頂點v的最短路徑p[v]及帶權長度d[v]

//p=-1表示沒有路徑,p[v][i]存的是從v0到v當前求得的最短路徑經過的第i+1個頂點(這是列印最短路徑的關鍵),則v0到v的最短路徑即為p[v][0]到p[v][j]直到p[v][j]=-1,路徑列印完畢。

//final[v]為true當且僅當v∈s,即已經求得從v0到v的最短路徑。

void shortestpath_dij(mgraph g, int v0, int p[max_vertex_num], int

d) }

d[v0]=0;//

v0到v0距離為0

final[v0]=true;//

v0頂點併入s集

for(i=1; i//

其餘g.vexnum-1個頂點

//開始主迴圈,每次求得v0到某個頂點v的最短路徑,並將v併入s集,然後更新p和d

min=infinity;

for(w=0; w//

對所有頂點檢查

if(!final[w] && d[w]//

在s集之外(即final=false)的頂點中找離v0最近的頂點,將其賦給v,距離賦給min

v=w;

min=d[w];

}final[v]=true;//

v併入s集

for(w=0; w//

根據新併入的頂點,更新不在s集的頂點到v0的距離和路徑陣列

if(!final[w] && mind[w])) }}

}}}

intmain()

cout

<0]<

到各頂點的最短路徑及長度為:

"<

for(i=0; i)

cout

<

} else

if(d[i]==infinity)

cout

<0]<

<

不可達"

<

}return0;

}

view code

請輸入頂點數和邊數:5

7請輸入頂點:a b c d e

請輸入邊和權值:

a d

2a b

4b d

1b c

4c d

1d e

7c e

3最短路徑陣列p[i][j]如下:

-1 -1 -1 -1 -1

01 -1 -1 -101

2 -1 -1

03 -1 -1 -103

4 -1 -1

a到各頂點的最短路徑及長度為:

a-b的最短路徑長度為:4

最短路徑為:a b

a-c的最短路徑長度為:8

最短路徑為:a b c

a-d的最短路徑長度為:2

最短路徑為:a d

a-e的最短路徑長度為:9 最短路徑為:a d e

迪傑斯特拉最短路徑

問題描述 在帶權有向圖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...