题意翻译
题目大意
给出一张图,请输出其中任意一条可行的从点
11
1 到点
nn
n 的最短路径。
输入输出格式
输入格式
第一行:两个整数n,m,分别表示点数和边数
接下来m行:每行三个整数u,v,w,表示u和v之间连一条边权为w的双向边。
输出格式
一行:一个可行的路径,如果不存在这种路径输出-1
2 < = n < = 1 0 5 0 < = m < = 1 0 5 2<=n<=10^5,0<=m<=10^5 2<=n<=1050<=m<=105

5 6
1 2 2
2 5 5
2 3 4
1 4 1
4 3 3
3 5 1
1 4 3 5 

注意这里输出路径要到着输出

不知道为什么链式前向星中 head用-1就WA,以后都不用-1了,遇见从0开始的就++

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#define ls (p<<1)
#define rs (p<<1|1)
#define mid (l+r)/2
#define over(i,s,t) for(int i=s;i<=t;++i)
#define lver(i,t,s) for(int i=t;i>=s;--i)
using namespace std;
typedef long long ll;
const ll N=1e5+7;
const ll INF=1e13+7;
const ll mod=2147483647;
const double EPS=1e-6;
struct node
{
    ll nex,v,val;
}edge[N<<2];
ll n,m;
ll head[N],cnt,tot;
bool flag,vis[N];
ll dis[N],pre[N],pa[N];
priority_queue< pair<ll,ll> >q;
inline void add(ll x,ll y,ll v)
{
    edge[++cnt].nex=head[x];
    edge[cnt].v=y;
    edge[cnt].val=v;
    head[x]=cnt;
}
void dijkstra()
{
    over(i,1,n)dis[i]=INF;
    memset(vis,false,sizeof vis);
    q.push(make_pair(0,1));
    dis[1]=0;
    while(!q.empty())
    {
        ll u=q.top().second;
        q.pop();
        if(vis[u])continue;
        vis[u]=true;
        for(int i=head[u];i;i=edge[i].nex)
        {
            ll v=edge[i].v;
            if(dis[u]+edge[i].val<dis[v])
            {
                dis[v]=dis[u]+edge[i].val;
                q.push(make_pair(-dis[v],v));
                pre[v]=u;
            }
        }
    }
}
inline void print()
{
    for(int i=n;i;i=pre[i])
    {
        pa[++tot]=i;
        if(i==1)flag=true;
    }
    if(flag)
    {
        lver(i,tot,1)
        printf("%lld ",pa[i]);
    }
    else printf("-1");
    return;
}
int main()
{
    scanf("%lld%lld",&n,&m);
    over(i,1,m){
        ll x,y,z;
        scanf("%lld%lld%lld",&x,&y,&z);
        add(x,y,z);
        add(y,x,z);
    }
    dijkstra();
    print();
    return 0;
}

有任何疑问欢迎评论哦虽然我真的很菜