题意翻译
题目大意
给出一张图,请输出其中任意一条可行的从点
11
1 到点
nn
n 的最短路径。
输入输出格式
输入格式
第一行:两个整数n,m,分别表示点数和边数
接下来m行:每行三个整数u,v,w,表示u和v之间连一条边权为w的双向边。
输出格式
一行:一个可行的路径,如果不存在这种路径输出-1
2<=n<=105,0<=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;
}
有任何疑问欢迎评论哦虽然我真的很菜