資料結構 Dijkstra演算法最清楚的講解

2021-08-20 20:08:18 字數 2617 閱讀 2326

迪傑斯特拉(dijkstra)演算法是典型最短路徑演算法,用於計算乙個節點到其他節點的最短路徑。

它的主要特點是以起始點為中心向外層層擴充套件(廣度優先搜尋思想),直到擴充套件到終點為止

基本思想

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

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

初始時,s中只有起點s;u中是除s之外的頂點,並且u中頂點的路徑是」起點s到該頂點的路徑」。然後,從u中找出路徑最短的頂點,並將其加入到s中;接著,更新u中的頂點和頂點對應的路徑。 然後,再從u中找出路徑最短的頂點,並將其加入到s中;接著,更新u中的頂點和頂點對應的路徑。 … 重複該操作,直到遍歷完所有頂點。

操作步驟

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

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

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

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

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

**這裡寫描述

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

這裡寫描述

初始狀態: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)。

**鄰接矩陣為例,

// 鄰接矩陣

typedef struct _graph

graph, *pgraph;

// 邊的結構體

typedef struct _edgedata

edata;

123

4567

891011

1213

1415

16

graph是鄰接矩陣對應的結構體。

vexs用於儲存頂點,vexnum是頂點數,edgnum是邊數;matrix則是用於儲存矩陣資訊的二維陣列。

例如,matrix[i][j]=1,則表示」頂點i(即vexs[i])」和」頂點j(即vexs[j])」是鄰接點;matrix[i][j]=0,則表示它們不是鄰接點。

edata是鄰接矩陣邊對應的結構體。

dijkstra演算法

/* * dijkstra最短路徑。

* 即,統計圖(g)中」頂點vs」到其它各個頂點的最短路徑。

* * 引數說明:

* g – 圖

* vs – 起始頂點(start vertex)。即計算」頂點vs」到其它頂點的最短路徑。

* prev – 前驅頂點陣列。即,prev[i]的值是」頂點vs」到」頂點i」的最短路徑所經歷的全部頂點中,位於」頂點i」之前的那個頂點。

* dist – 長度陣列。即,dist[i]是」頂點vs」到」頂點i」的最短路徑的長度。

*/ void dijkstra(graph g, int vs, int prev, int dist)

// 對"頂點vs"自身進行初始化

flag[vs] = 1;

dist[vs] = 0;

// 遍歷g.vexnum-1次;每次找出乙個頂點的最短路徑。

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

{ // 尋找當前最小的路徑;

// 即,在未獲取最短路徑的頂點中,找到離vs最近的頂點(k)。

min = inf;

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

{if (flag[j]==0 && dist[j]參考資料

1,

資料結構 Dijkstra演算法最清楚的講解

2016年03月30日 15 10 19 迪傑斯特拉 dijkstra 演算法是典型最短路徑演算法,用於計算乙個節點到其他節點的最短路徑。它的主要特點是以起始點為中心向外層層擴充套件 廣度優先搜尋思想 直到擴充套件到終點為止 通過dijkstra計算圖g中的最短路徑時,需要指定起點s 即從頂點s開始...

資料結構 Dijkstra演算法最清楚的講解

迪傑斯特拉 dijkstra 演算法是典型最短路徑演算法,用於計算乙個節點到其他節點的最短路徑。它的主要特點是以起始點為中心向外層層擴充套件 廣度優先搜尋思想 直到擴充套件到終點為止 通過dijkstra計算圖g中的最短路徑時,需要指定起點s 即從頂點s開始計算 此外,引進兩個集合s和u。s的作用是...

資料結構 Dijkstra演算法

在了解 dijkstra演算法 之前,要先了解一下路徑的問題 路徑 考慮帶權有向圖,把一條路徑 僅僅考慮簡單路徑 上所經邊的權值之和定義為該路徑的路徑長度或稱帶權路徑長度。最短路徑 從源點到終點可能不止一條路徑,把路徑長度最短的那條路徑稱為最短路徑。從乙個頂點到其餘各頂點的最短路徑 問題描述 給定乙...