迪傑斯特拉演算法(步步貪心)
阿新 • • 發佈:2021-12-01
迪傑斯特拉演算法
1.迪傑斯特拉演算法是求原點到各個點的最短距離,用的是步步貪心的方法所以不能解決帶負權圖,這個到後邊說
2.迪傑斯特拉演算法的實現
要用到的陣列 :
(1)graph[ ] [ ]用來存圖
(2)flag[ ]用來記錄此點是否已經被加入
(3)path[ i ]用來表示從原點到達 i 節點的前驅,輸出時直到找到前驅為原點即可,用來存路徑。具體參見弗洛伊德演算法中的路徑
(4)dist[ ]記錄原點到各個點的即時最短路徑
3.程式碼的實現
(1)初始化各個陣列
graph[][] //輸入自行建圖 flag[] = 0//開始時全部的點都沒用到 path[ ] = sor //開始時前一個點是原點for() dist[i] = graph[sor][i]//初始化dist[ ] flag[sor] = true//原點不用往裡加 dist[sor] = 0//到自己不用算
(2)依次貪心加入點並做標記,直到全部加入
for(int i = 1; i < v; i++) { int minx = 9999999;//設定一個無限大的量相對於graph int k = 0;//記錄要加入的點 for(int j = 0; j < v; j++) { if(dist[j] < minx&&!flag[j]) { k= j; minx = dist[j]; } } flag[k] = true;//使用過的點做標記 for(int j = 0; j < v; j++) { if(dist[j] > minx + graph[k][j]) { dist[j] = minx + graph[k][j]; path[ j ] = k; } } }
(3)
輸出dist 和 path即可