学习最短路的Dijkstra算法后,在此记录模板以防忘记。
题目链接:P4779 【模板】单源最短路径(标准版) - 洛谷
#include <iostream>
#include <vector>
#include <queue>
#include <utility>
using namespace std;
#define int long long
#define endl '\n'
const int INF = 0x3f3f3f3f3f3f3f3f; // 很大的值
int n, m, s; // n个点 m条边 从s开始
const int N = 1e5 + 7;
class node {
public:
int y = 0;
int w = 0;
node(int _y, int _w) : y(_y), w(_w) {}
};
vector<node> g[N]; // x指向y
vector<int> dist;
vector<int> vis;
void dijkstra(int k) { // k为起始点
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> q; // 最小堆
//q 第一个元素为dist,第二个为点位标号
dist[k] = 0;
q.push({ 0, k });
while (!q.empty()) {
int x = q.top().second;
q.pop();
if (vis[x]) continue;
vis[x] = 1;
for (auto to : g[x]) {
int y = to.y;
int w = to.w;
if (dist[x] + w < dist[y]) {
dist[y] = dist[x] + w;
q.push({ dist[y], y });
}
}
}
}
signed main() {
cin >> n >> m >> s;
vis.assign(n + 1, 0);
dist.assign(n + 1, INF);
for (int i = 0; i < m; i++) {
int u, v, w;
cin >> u >> v >> w;
g[u].push_back(node(v, w));
}
dijkstra(s);
for (int i = 1; i <= n; i++) {
if (dist[i] == INF) cout << "INF ";
else cout << dist[i] << " ";
}
return 0;
}