单源最短路径
Created Mar 5, 2025 - Last updated: Apr 23, 2025
Evergreen 🌳
图论
algorithm
dijsktra
#include <climits>
#include <cstdio>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
void dfs(const vector<long long>& path, long long i)
{
if (i == 1) {
printf("1");
return;
}
dfs(path, path[i]);
printf(" %lld", i);
}
int main()
{
long long n, m;
cin >> n >> m;
vector<vector<pair<long long, long long>>> graph(n + 1);
for (long long i = 0; i < m; i++) {
long long u, v, w;
cin >> u >> v >> w;
graph[u].emplace_back(v, w);
graph[v].emplace_back(u, w);
}
vector<long long> dist(n + 1, LLONG_MAX);
vector<long long> path(n + 1, 0);
vector<bool> collected(n + 1, false);
priority_queue<pair<long long, long long>, vector<pair<long long, long long>>, greater<>> pq;
dist[1] = 0;
pq.emplace(0, 1);
while (!pq.empty()) {
auto [d, u] = pq.top();
pq.pop();
if (collected[u])
continue;
collected[u] = true;
for (auto [v, w] : graph[u]) {
if (dist[u] + w < dist[v]) {
dist[v] = dist[u] + w;
path[v] = u;
pq.emplace(dist[v], v);
}
}
}
if (dist[n] == LLONG_MAX) {
printf("-1");
return 0;
}
dfs(path, n);
return 0;
}