下面代码 有么有佬解释下这个dj板子咋回事
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
const int N=100010;
int n,m,s,a,b,c;
#define inf 1e13+5
struct edge{int v,w;};
vector<edge> e[N];
long long d[N];
int vis[N];
int prefix[N];
int num[N];
void dijkstra(int s){
for(int i=1;i<=n;i++)d[i]=inf;
d[s]=0;
priority_queue<pair<long long ,int>> q;
q.push({0,s});
while(q.size()){
auto t=q.top(); q.pop();
int u=t.second;
if(vis[u])continue; //再出队跳过
//千万千万记住 pop在continue前面 切记 否则死循环
vis[u]=1; //标记u已出队一点一次自己走while循环只有一次
for(auto ed : e[u]){
int v=ed.v, w=ed.w;
//cout<<v<<endl;
if(d[v]>d[u]+w){
d[v]=d[u]+w;
prefix[v]=u;
q.push({-d[v],v}); //大根堆
}
}
}
}
int main(){
cin>>n>>m;
for(int i=0; i<m; i++)
{
cin>>a>>b>>c, e[a].push_back({b,c});
e[b].push_back({a,c});
}
dijkstra(1);
if(d[n]==inf){cout<<-1;return 0;}
int q=n;
int ed=0;
while(q!=1)
{
num[ed]=q;
q=prefix[q];
ed++;
}
num[ed]=1;
for(int i=ed;i>=0;i--)
{
cout<<num[i]<<" ";
}
}