資料結構之最短路徑 1 迪傑斯特拉演算法

2021-09-24 16:15:14 字數 3369 閱讀 4759

基本思想:

通過dijkstra計算圖g中的最短路徑時,需要指定起點s(即從頂點s開始計算)。

此外,引進兩個集合s和u。s的作用是記錄已求出最短路徑的頂點(以及相應的最短路徑長度),而u則是記錄還未求出最短路徑的頂點(以及該頂點到起點s的距離)。

初始時,s中只有起點s;u中是除s之外的頂點,並且u中頂點的路徑是"起點s到該頂點的路徑"。然後,從u中找出路徑最短的頂點,並將其加入到s中;

接著,更新u中的頂點和頂點對應的路徑。 然後,再從u中找出路徑最短的頂點,並將其加入到s中;接著,更新u中的頂點和頂點對應的路徑。 ... 重複該操作,

直到遍歷完所有頂點。

操作步驟:

(1)初始時,s只包含起點s;u包含除s外的其他頂點,且u中頂點的距離為"起點s到該頂點的距離"[例如,u中頂點v的距離為(s,v)的長度,然後s和v不相鄰,則v的距離為∞]。

(2)從u中選出"距離最短的頂點k",並將頂點k加入到s中;同時,從u中移除頂點k。

(3)更新u中各個頂點到起點s的距離。之所以更新u中頂點的距離,是由於上一步中確定了k是求出最短路徑的頂點,從而可以利用k來更新其它頂點的距離;例如,(s,v)的距離可能大於(s,k)+(k,v)的距離。

(4)重複步驟(2)和(3),直到遍歷完所有頂點。

單純的看上面的理論可能比較難以理解,下面通過例項來對該演算法進行說明。

以上圖g4為例,來對迪傑斯特拉進行演算法演示(以第4個頂點d為起點)。

初始狀態:s是已計算出最短路徑的頂點集合,u是未計算除最短路徑的頂點的集合!

第1步:將頂點d加入到s中。 

此時,s=, u=。 注:c(3)表示c到起點d的距離是3。

第2步:將頂點c加入到s中。 

上一步操作之後,u中頂點c到起點d的距離最短;因此,將c加入到s中,同時更新u中頂點的距離。以頂點f為例,之前f到d的距離為∞;但是將c加入到s之後,f到d的距離為9=(f,c)+(c,d)。 

此時,s=, u=。

第3步:將頂點e加入到s中。 

上一步操作之後,u中頂點e到起點d的距離最短;因此,將e加入到s中,同時更新u中頂點的距離。還是以頂點f為例,之前f到d的距離為9;但是將e加入到s之後,f到d的距離為6=(f,e)+(e,d)。 

此時,s=, u=。

第4步:將頂點f加入到s中。 

此時,s=, u=。

第5步:將頂點g加入到s中。 

此時,s=, u=。

第6步:將頂點b加入到s中。 

此時,s=, u=。

第7步:將頂點a加入到s中。 

此時,s=。

此時,起點d到各個頂點的最短距離就計算出來了:a(22) b(13) c(3) d(0) e(4) f(6) g(12)。

**如下:

1 #include "

stdafx.h

"2 #include3 #include

4#define max_vertex_num 100

5#define infinity 65535

6 typedef int pathmatirx[max_vertex_num];//

存放最短路徑下標的陣列

7 typedef int shortpathtable[max_vertex_num];//

存放到各頂點最短路徑的權值之和

8using

namespace

std;

9 typedef struct graph //

有向圖的鄰接矩陣

10graph;

1516

int locatevex(graph g, char ch) //

搜尋17

2324

void creategraph(graph &g) //

建立無向圖

2535

for (i = 0; i < g.vexnum; i++)

36for (j = 0; j < g.vexnum; j++)

37 g.arcs[i][j] =infinity;

38 cout << "

請輸入弧尾、弧頭以及權值:

"<

39for (int k = 0; k < g.arcnum; k++)

4046}47

48void shortestpath_dijkstra(graph g, int v0, int prev, int dist)//

迪傑斯特拉演算法

49 58 dist[v0] = 0; //

v0至v0的路徑為0

59 final[v0] = 1; //

v0至v0不需要求路徑

60for (v = 1; v < g.vexnum; v++)//

開始主迴圈,每次求得v0到某個v頂點的最短路徑

6170

}71 final[k] = 1; //

將目前找到的最近的頂點值為1

72for (w = 0; w < g.vexnum; w++)//

修正當前最短路徑及距離

73 79}

80}81 cout << "

起始點:

"; //

一下就是輸出函式

82 cout << g.vexs[v0]<

83 cout << "

從開始點

"<< g.vexs[v0] << "

到各點的最短距離為:

"<

84for (int i = 0; i < g.vexnum; i++)

85 cout << "到"

<< g.vexs[i] << "

的距離為:

"<< dist[i] <

8788

intmain()

89

示例展示:

迪傑斯特拉最短路徑

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