Dijkstra實現最短路徑
阿新 • • 發佈:2019-01-08
main https 下標 () ios redirect www 距離 con
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; const int MAXV=1000; const int INF=100000000; int n,m,s,G[MAXV][MAXV]; int d[MAXV];//起點到達各點的最短路徑長度 bool vis[MAXV]={false}; void Dijkstra(int s){ fill(d,d+MAXV,INF); d[s]=0; for(int i=0;i<n;i++){ int u=-1,MIN=INF; for(int j=0;j<n;j++){ if(vis[j]==false&&d[j]<MIN){ u=j; MIN=d[j]; } } if(u==-1) return; vis[u]=true; for(int v=0;v<n;v++){ if(vis[v]==false&&G[u][v]!=INF&&d[u]+G[u][v]<d[v]){ d[v]=d[u]+G[u][v]; } } } } int main(){ int u,v,w; cin>>n>>m>>s; fill(G[0],G[0]+MAXV*MAXV,INF); for(int i=0;i<m;i++){ cin>>u>>v>>w; G[u][v]=w; } Dijkstra(s); for(int i=0;i<n;i++){ cout<<d[i]<<" "; } return 0; }
測試:
6 8 0
0 1 1
0 3 4
0 4 4
1 3 2
2 5 1
3 2 2
3 4 3
4 5 3
代碼解釋:
void d(){ //初始化圖 //將出發點到出發點的距離設為0 for(循環n次){//n表示頂點數 //設當前欲訪問的頂點下標為u=-1; //設所有點中到起點距離最短的那個點的路徑長為MAX=100000000000; for(循環n次){ if(第n個點沒有被訪問&&該點到起點的路徑最短){ MAX=最短路徑; u=n;//記錄該點,即該點已經被訪問 } } if(u==-1) return;//所有點已經被訪問,函數結束 //標記u點被訪問 for(n次循環){ if(該點沒有被訪問&&該點到新被訪問頂點u的距離小於原來路徑){ //更新路徑 } } } }
視頻解釋:https://www.bilibili.com/video/av38254646/?redirectFrom=h5
時間復雜度=n*(n+n)
關於該算法的題目和思想後續還會更新
Dijkstra實現最短路徑