Coderforces 20C 最短路记录路径

来源:互联网 发布:勿谓言之不预也 知乎 编辑:程序博客网 时间:2024/06/08 17:03

题意:给定一个带权无向图。你需要求出从点 1 到点 n的最短路。
思路:使用Dijkstra算法,当进行松弛操作时用数组记录下前缀,输出时先从n向1回溯记录再输出;

#include<iostream>#include<algorithm>#include<string>#include<cstring>#include<map>#include<queue>#include<cmath>#include<stack>#include<vector>#include<cstdio>#define MAXN 33000#define INF 0x3f3f3f3f#define lmid l,m,rt<<1#define rmid m+1,r,rt<<1|1#define ls rt<<1#define rs rt<<1|1#define Mod 1000000007#define i64 __int64#define LIMIT_ULL 100000000000000000using namespace std;typedef pair<long long,int>P;struct node{     int v,w;     int next;}s[200005];int head[100005];int cnt=1;void add(int u,int v,int w){     s[cnt].v=v;     s[cnt].w=w;     s[cnt].next=head[u];     head[u]=cnt++;}long long dj[100005];int lj[100005];int jl[100005];int n,m;void djstl(int pos){     lj[pos]=pos;     fill(dj+1,dj+n+1,100000000000);     dj[pos]=0;     priority_queue<P,vector<P>,greater<P>>q;     q.push(P(0,pos));     node e;     while(!q.empty())     {          P p=q.top();          q.pop();          int v=p.second;          if(p.first>dj[v])               continue;          for(int i=head[v];~i;i=s[i].next)          {               e=s[i];               if(dj[e.v]>dj[v]+e.w)               {                    lj[e.v]=v;                    dj[e.v]=dj[v]+e.w;                    q.push(P(dj[e.v],e.v));               }          }     }}int main(){     scanf("%d%d",&n,&m);     memset(head,-1,sizeof(head));     for(int i=0;i<m;i++)     {          int a,b,c;          scanf("%d%d%d",&a,&b,&c);          add(a,b,c);          add(b,a,c);     }     djstl(1);     if(dj[n]==100000000000)          cout<<-1<<endl;     else     {          int len=0;          int k=n;          while(lj[k]!=1)          {               jl[len++]=lj[k];               k=lj[k];          }          jl[len++]=lj[k];          for(int i=len-1;i>=0;i--)          {               cout<<jl[i]<<" ";          }          cout<<n<<endl;     }     return 0;}