C++實現Dijkstra(迪傑斯特拉)演算法
阿新 • • 發佈:2020-05-29
Dijkstra演算法 Dijkstra(迪傑斯特拉)演算法是典型的最短路徑路由演算法,是廣度優先演算法的一種,用於計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。其基本原理是:每次新擴充套件一個距離最短的點,更新與其相鄰的點的距離。當所有邊權都為正時,由於不會存在一個距離更短的沒擴充套件過的點,所以這個點的距離永遠不會再被改變,因而保證了演算法的正確性。不過根據這個原理,用Dijkstra求最短路的圖不能有負權邊,因為擴充套件到負權邊的時候會產生更短的距離,有可能就破壞了已經更新的點距離不會改變的性質。 Dijkstra演算法能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。 Dijkstra演算法是很有代表性的最短路演算法,在很多專業課程中都作為基本內容有詳細的介紹,如資料結構,圖論,運籌學等等。
Dijkstra 演算法的時間複雜度為O(n^2)
空間複雜度取決於儲存方式,鄰接矩陣為O(n^2)
程式碼實現
#include <stdio.h> #include <vector> #include <iostream> using namespace std; #define INF 0x7fffffff #define maxN 50 #define USE_C 1 #define NOT_USE_C 0 #define USE_CPP 1 int matrix[maxN][maxN]; void Dijkstra_cpp(vector<vector<int>>&vec,vector<int>& result,int v0){ vector<int> visited(vec.size(),0); int last_visitied = 0; result[0] = 0; for(int i =0;i<vec.size()-1;i++){ for(int j = 0;j<vec.size()-1;j++){ if(visited[i]==0){ if(vec[v0][j]!= 0){ int dist =vec[v0][j] +last_visited; if(dist<result[j]) result[j] = dist; } } } int minIndex = 0; while(visited[minIndex] == 1) minIndex++; for(int j = minIndex;j<vec.size();j++){ if(visited[j] ==0&&result[j]<result[minIndex]){ minIndex = j; } } last_visited = result[minIndex]; visited[minIndex] = 1; v0 = minIndex; } } int _tmain(int argc,_TCHAR* argv[]){ freopen("Dijkstra2Data.txt","r",stdin); int n; cin>>n; vector<vector<int>> vec(n,vector<int>(n,0)); for(i = 0;i<n;i++){ for(j = 0;j<n;j++){ cin>>vec[i][j]; } } vector<int> result(n,INF); Dijkstra_cpp(vec,result,0); for(int i =0;i<n;i++){ if(result[i] == INF) cout<<"INF"<<endl; else cout<<result[i]<<endl; } return 0; }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。