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

2021-09-08 10:27:16 字數 2309 閱讀 6504

首先需要記錄每個點到原點的距離,這個距離會在每一輪遍歷的過程中重新整理。每乙個節點到原點的最短路徑是其上乙個節點(前驅節點)到原點的最短路徑加上前驅節點到該節點的距離。以這個原則,經過n輪計算就能得到每乙個節點的最短距離。

第一輪,可以計算出,2、3、4、5、6到原點1的距離分別為:[7, 9, -1, -1, 14]。-1表示無窮大。取其中最小的,為7,即可以確定1的最短路徑為0,2為下一輪的前驅節點。同時確定2節點的最短路徑為7,路線:1->2。

第二輪,取2節點為前驅節點,按照前驅節點的最短距離加上該節點與前驅節點的距離計算新的最短距離,可以得到3,4,5,6節點到原點的距離為:[17, 22, -1, -1],此時需要將這一輪得到的結果與上一輪的比較,3節點:17 > 9,最短路徑仍然為9;4節點:22 < 無窮大,重新整理4節點的最短路徑為225節點:不變,仍然為無窮大6節點:14 < 無窮大,取14,不變。則可以得到本輪的最短距離為:[9, 22, -1, 14],

取最短路徑最小的節點,為3,作為下一輪的前驅節點。同時確定3節點的最短路徑為9,路線:1->3。

第三輪,同上,以3為前驅節點,得到4,5,6的計算距離為:[20, -1, 11],按照取最短路徑的原則,與上一輪的進行比較,重新整理為:[20, –1, 11],選定6為下一輪的前驅節點。同時取定6的最短路徑為11,路線:1->3->6。

第四輪,同上,以6為前驅節點,得到4和5的計算距離為[20, 20],與上一輪進行比較,重新整理後為[20, 20],二者相等只剩下兩個節點,並且二者想等,剩下的計算已經不需要了。則兩個節點的最短路徑都為20。整個計算結束。4的最短路徑為20,路線:1->3->4。5的最短路徑為20,路線:1->3->6->5。

如果二者不相等,則還需要進行第五輪,先確定二者中的乙個的最短路徑和路線,再取定剩下的。直到整個5次迴圈都完成。

function dijkstra(g, w, s)

for each vertex v in v[g] //

初始化 d[v] := infinity //

將各點的已知最短距離先設成無窮大

previous[v] := undefined //

各點的已知最短路徑上的前趨都未知

d[s] := 0 //

因為出發點到出發點間不需移動任何距離,所以可以直接將s到s的最小距離設為0

s :=empty set

q :=set of all vertices

while q is not an empty set //

dijkstra演算法主體

u :=extract_min(q)

foreach edge outgoing from u as (u,v)

if d[v] > d[u] + w(u,v) //

拓展邊(u,v)。w(u,v)為從u到v的路徑長度。

d[v] := d[u] + w(u,v) //

更新路徑長度到更小的那個和值。

previous[v] := u //

記錄前面頂點

public

class

dijkstra

, ,, ,

, };

int orig = 0;

int shortpath =dijsktra(map1, orig);

if (shortpath == null

)

for (int i = 0; i < shortpath.length; i++)

}public

static

int dijsktra(int weight, int

orig)}}

//正確的圖生成的矩陣不可能出現k == m的情況

if (k ==m)

shortest[k] =dmin;

visited[k] = true

;

//以k為中間點,修正從原點到未訪問各點的距離

for (int i = 0; i < n; i++)}}

}return

shortest;}}

參考:

Dijkstra(迪傑斯特拉)演算法

迪傑斯特拉 dijkstra 演算法是典型最短路徑演算法,用於計算乙個節點到其他節點的最短路徑。它的主要特點是以起始點為中心向外層層擴充套件 廣度優先搜尋思想 直到擴充套件到終點為止。指定乙個節點,例如我們要計算 a 到其他節點的最短路徑 引入兩個集合 s u s集合包含已求出的最短路徑的點 以及相...

dijkstra迪傑斯特拉演算法

注意 1.標頭檔案climits的int max,加上2整數會溢位,每次相加前得判斷被加值是否為int max,int max 10為負數 2.得先初始化再對d s c s g,cost等賦值 fill d 0 d 0 max,int max fill g 0 0 g 0 0 max max,int...

迪傑斯特拉 Dijkstra 演算法

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