dijkstar演算法求單源最短路徑思路(圖解)
阿新 • • 發佈:2021-11-08
dijkstar演算法求單源最短路徑
貪心演算法
思路概括
需要用到的資料結構:
一維陣列dist[n]--根據下標存放源點到所有其他點的最短路徑,
例如:dist[1]=10, 表示源點到達結點1的最短路徑的長度為10
一維陣列path[n]--根據下標存放某個點的前一個點的資訊,這個點是所有能夠到達該點中路徑最短的一個點
例如:path[2]=3, 表示能夠從結點3到達結點2,並且結點3到結點2的距離是所有到達結點2中最短的
一維標記陣列S[n]--根據下標存放bool值,表示該點已經找到到達該點的最短路徑
minval--存放每一輪迴圈中dist[n]中最小的值,k--存放該最小值對應的結點
思路:
從選取的源點求到其餘所有n個點的最短路徑,需要n次迴圈
每次迴圈找到某一個點的最短路徑,重複n次就能找到源點到每一個結點的最短路徑
具體看圖:
迴圈結束時,dist就儲存了源點到所有其他點的最短距離,path也儲存好了直接前驅,通過適當的輸出即可求出單源最短路徑
程式碼如下:
點選檢視程式碼
class Solution { public: void GetPath(vector<vector<int>>vec,int v0) { int size = vec.size(); int S[MAX], k, minval; vector<int>dist(size);//dist存放單源最短路徑 vector<int>path(size); //初始化 for (int i = 0; i < size; i++) { dist[i] = vec[v0][i]; if (dist[i] != MAX)path[i] = v0; else path[i] = -1; } S[v0] = 1; dist[v0] = 0; int num = 1; path[v0] = -1; while (num < size) { k = 0; minval = MAX; for(int i=0;i<size;i++) if ((dist[i] < minval) && (S[i] != 1)) { minval = dist[i]; k = i; } S[k] = 1; for(int i=0;i<size;i++) if ( dist[k] + vec[k][i]<dist[i] ) { dist[i] = dist[k] + vec[k][i]; path[i] = k; } num++; } cout<<"\n源點到各頂點的最短路徑長和路徑:"; for (int i = 0; i != size; i++) { if (i == v0 )cout << "\n"<<dist[i]<< "\tpath:" << i << " <- " << v0; else if (dist[i] == MAX)cout<<"\n無路徑" << "\tpath:" << i << " <- " << v0; else { cout << "\n" << dist[i] << "\tpath:" << i << " "; int pre = path[i]; while (pre != -1) { cout << " <- " << pre << ' '; pre = path[pre]; } } } } };