Dijkstra是一种基于贪心的单源最短路算法,本文记录其朴素版,时间复杂度为n的平方
1 2 3 4 5 const int N=600 ,INF=0x3f3f3f3f ;int n,m;int d[N],path[N]; int mp[N][N]; bool book[N]={0 };
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 void init () { for (int i=1 ;i<=n;i++){ for (int j=1 ;j<=n;j++){ mp[i][j]=INF; } d[i]=INF; path[i]=-1 ; } for (int i=0 ;i<m;i++){ int x,y,z; cin>>x>>y>>z; if (x!=y){ mp[x][y]=min (mp[x][y],z); } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 void Dijkstra () { d[1 ]=0 ; for (int i=1 ;i<=n;i++){ int t=-1 ; for (int j=1 ;j<=n;j++){ if ((!book[j]&&t==-1 )||(!book[j]&&d[j]<d[t])){ t=j; } } book[t]=1 ; for (int j=1 ;j<=n;j++){ if (d[j]>mp[t][j]+d[t]){ d[j]=mp[t][j]+d[t]; path[j]=t; } } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 #include <bits/stdc++.h> using namespace std;typedef long long ll;const int N=600 ,INF=0x3f3f3f3f ;int n,m;int d[N],path[N]; int mp[N][N]; bool book[N]={0 }; void init () { for (int i=1 ;i<=n;i++){ for (int j=1 ;j<=n;j++){ mp[i][j]=INF; } d[i]=INF; path[i]=-1 ; } for (int i=0 ;i<m;i++){ ll x,y,z; cin>>x>>y>>z; if (x!=y){ mp[x][y]=min (mp[x][y],z); } } }void Dijkstra () { d[1 ]=0 ; for (int i=1 ;i<=n;i++){ int t=-1 ; for (int j=1 ;j<=n;j++){ if ((!book[j]&&t==-1 )||(!book[j]&&d[j]<d[t])){ t=j; } } book[t]=1 ; for (int j=1 ;j<=n;j++){ if (d[j]>mp[t][j]+d[t]){ d[j]=mp[t][j]+d[t]; path[j]=t; } } } }int main (void ) { cin>>n>>m; init (); Dijkstra (); int k=n; while (k!=-1 ){ cout<<k<<' ' ; k=path[k]; } cout<<endl; cout<<(d[n]==INF?-1 :d[n]); }
AcWing-849. Dijkstra求最短路 I