1. 程式人生 > 實用技巧 >最短路徑

最短路徑

#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; }

複製同學程式碼參考