题目
分析
long long数据 + SPFA最短路模板 + 打印路径
AC代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
const int MAXN = 200005;
const long long INF = 1ll << 62;
using namespace std;
int head[MAXN], vis[MAXN], path[MAXN];
long long dis[MAXN];
vector<int> ans;
int id;
struct Edge
{
int w;
int to;
int next;
}edge[MAXN];
void add(int u, int v, int w)
{
edge[id].w = w;
edge[id].to = v;
edge[id].next = head[u];
head[u] = id++;
}
void SPFA(int start)
{
queue<int> q;
q.push(start);
vis[start] = 1;
dis[start] = 0;
while(!q.empty())
{
int cur = q.front();
q.pop();
for(int i = head[cur]; i!=-1; i = edge[i].next)
{
int to = edge[i].to;
if(dis[to] > dis[cur] + edge[i].w)
{
dis[to] = dis[cur] + edge[i].w;
path[to] = cur;
if(!vis[to])
{
vis[to] = 1;
q.push(to);
}
}
}
vis[cur] = 0;
}
}
int main()
{
int n, m;
scanf("%d%d", &n, &m);
memset(head, -1, sizeof(head));
memset(path, -1, sizeof(path));
for(int i = 1; i <= n; i++)
{
dis[i] = INF;
}
for(int i = 1; i <= m; i++)
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
add(u, v, w);
add(v, u, w);
}
SPFA(1);
int i, flag = 0;
for (i = n; i != -1; i = path[i])
{
ans.push_back(i);
if (i == 1)
{
flag = 1;
break;
}
}
if (flag)
{
for (int i = ans.size() - 1; i >= 0; i--)
{
printf("%d ", ans[i]);
}
}
else
{
printf("-1");
}
return 0;
}