Dijkstra板子
看讨论区里有说加long long的,我加了,有说改最大值的,我也改了,但是还是过不去,求解。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=1e5+10;
const int INF=LONG_MAX;
int num,ans;
int n,m,s,t;
struct node{
int id;
int dist;
node(){ id=0;dist=0;}
node(int c,int d){id=c;dist=d;}
bool operator < (const node &x)const{return x.dist<dist;}
};
priority_queue<node> que;
struct linkstar{
int to,from;
int w;
int next;
}edge[2*MAXN];
int head[MAXN];
int dis[MAXN];
int vis[MAXN];
int pre[MAXN];
int escnt;
void add(int from,int to,int w)
{
edge[++escnt].from=from;
edge[escnt].to=to;
edge[escnt].w=w;
edge[escnt].next=head[from];
head[from]=escnt;
}
void Dijkstra(int u)
{
for (int i=1;i<=n;i++) dis[i]=INF;
dis[u]=0;
que.push(node(u,0));
int cnt=0;
while(que.size()){
node cp=que.top();
que.pop();
if(vis[cp.id]) continue;
vis[cp.id]=true;
for (int i=head[cp.id];i!=-1;i=edge[i].next){
if(dis[edge[i].to]>dis[cp.id]+edge[i].w){
dis[edge[i].to]=dis[cp.id]+edge[i].w;
pre[edge[i].to]=cp.id;
if(!vis[edge[i].to]){
que.push(node(edge[i].to,dis[edge[i].to]));
}
}
}
}
}
stack<int> stk;
signed main()
{
memset(head,-1,sizeof(head));
cin>>n;
cin>>m;
for (int i=1;i<=m;i++)
{
int x,y,w;
cin>>x>>y>>w;
add(x,y,w);
add(y,x,w);
}
Dijkstra(1);
int last=n;
//cout<<dis[n]<<endl;
/*for (int i=1;i<=n;i++){
cout<<pre[i]<<" ";
}*/
if(dis[n]==INF){
cout<<"-1"<<endl;
return 0;
}
while(last){
stk.push(last);
last=pre[last];
}
while(stk.size()){
cout<<stk.top()<<" ";
stk.pop();
}
return 0;
}