acwing849Dijkstra求最短路I,普通模板
dijkstra伪代码
记录位置dist[i]=++++ dist[1]=0; for(int i:1~n){o(n) t=不在st中且距离1最近的点 o(n) st中记录下t 以t为中转更新其它点到1的最近距离 o(n) }普通dijkstra时间复杂度o(n2)
代码
#include <bits/stdc++.h> using namespace std; int n,m; const int N=505; int g[N][N]; int dist[N]; bool st[N];//记录下已经确定了最短距离的点 int dijkstra(){ memset(dist,0x3f,sizeof(dist)); dist[1]=0; for(int i=0;i<n-1;i++){ int t=-1;//指针t for(int j=1;j<=n;j++){ if(!st[j]&&(t==-1||dist[t]>dist[j]))//if(!vis[j]&&(t=-1||dist[t]>dist[j])) t=j; } for(int j=1;j<=n;j++) dist[j]=min(dist[j],dist[t]+g[t][j]); st[t]=true; } if(dist[n]==0x3f3f3f3f) return -1; else return dist[n]; } int main() { cin>>n>>m; int a,b,c; memset(g,0x3f,sizeof(g)); for(int i=0;i<m;i++){ scanf("%d%d%d",&a,&b,&c); g[a][b]=min(g[a][b],c); } printf("%d\n",dijkstra()); return 0; }