這是一個裸的最短路的模板題,可是它須要輸出路徑。node
用dijkstra的話首先敲一個最短路的板子,其次開一個數組p[]來記錄路徑,可是怎麼存呢?咱們須要記錄每個點的前驅,由於若是記錄後邊的話,一個點可能連多個節點,可是每個點的前驅只有一個點,因此記錄每個被壓入堆的點便可,最後輸出。若是用spfa的話,也同理存入被鬆弛的點。c++
1.必定要注意數據類型,long long 足以讓你死掉,固然也要所有修改,注意全局這個變量的出現都要修改。數組
2.注意加邊的時候是有向邊仍是無向邊。spa
3.記錄路徑必定是p[i]=j表明從j->i的路徑,因此輸出要倒序。code
代碼blog
#include<bits/stdc++.h> #define maxn 500005 #define maxm 500005 using namespace std; struct edge{ int next; long long w; int v; }e[maxm]; int n,m,tot=0,s; int head[maxn],vis[maxn],pos[maxn]; long long dis[maxn]; struct node{ long long w; int now; inline bool operator <(const node &x)const { return w>x.w;//這裏注意符號要爲'>' } }; inline void add(int u,int v,long long w){ e[++tot].next=head[u]; head[u]=tot; e[tot].w=w; e[tot].v=v; } priority_queue<node>q; void dijkstra(){ for(int i=1;i<=n;i++) { dis[i]=9223372036854775806; } dis[1]=0; q.push((node){0,1}); while(!q.empty()){ node x=q.top(); int u=x.now; q.pop(); if(vis[u]==1) continue; vis[u]=1; for(int i=head[u];i;i=e[i].next){ int v=e[i].v; if(dis[v]>dis[u]+e[i].w){ dis[v]=dis[u]+e[i].w; q.push((node){dis[v],v}); pos[e[i].v]=u; } } } } int main(){ cin>>n>>m; for(int i=1,x,y,z;i<=m;i++){ cin>>x>>y>>z; add(x,y,z); add(y,x,z); } dijkstra(); bool flag=false; int num=0; int ans[maxn]; for(int i=n;i;i=pos[i]){ ans[++num]=i; if(i==1){ flag=true; } } if(flag==true){ for(int i=num;i>=1;i--){ cout<<ans[i]<<" "; } } else cout<<-1; return 0; }