最短路徑
阿新 • • 發佈:2020-07-27
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e6+10; const int M=1e6+10; const ll inf=1e18+10; int head[N],ver[N],edge[N],nxt[N]; ll d[N]; int path[N],ans[N]; bool v[N]; int n,m,tot; priority_queue<pair<int,int> > q; void add(int x,int y,int z){ ver[++tot]=y;edge[tot]=z;nxt[tot]=head[x];head[x]=tot; } void dijkstra(){ for(int i=1;i<=n;i++) d[i]=inf; memset(v,0,sizeof(v)); d[1]=0; q.push(make_pair(0,1)); while(q.size()){ int x=q.top().second;q.pop(); if(v[x]) continue; v[x]=1; for(int i=head[x];i;i=nxt[i]){int y=ver[i],z=edge[i]; if(d[y]>d[x]+z){ d[y]=d[x]+z; path[y]=x; q.push(make_pair(-d[y],y)); } } } } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ int x,y,z; scanf("%d%d%d",&x,&y,&z); add(x,y,z); add(y,x,z); } dijkstra(); if(d[n]==inf){ printf("-1\n"); }else{ int tmp=n; printf("%d ",1); int cnt=0; while(path[tmp]!=1){ ans[++cnt]=path[tmp]; tmp=path[tmp]; } for(int i=cnt;i>=1;i--){ printf("%d ",ans[i]); } printf("%d\n",n); } return 0; }
複製同學程式碼參考