#include<bits/stdc++.h> using lint = longlong; const lint INF = 1e18; constint N = 5e3 + 10;
int n, m, s; lint dis[N]; bool vis[N]; std::vector<std::pair<int, lint>> G[N];
voiddijkstra(){ std::fill(dis + 1, dis + n + 1, INF); dis[s] = 0; for (int i = 1; i <= n; ++i) { int u = 0; for (int j = 1; j <= n; ++j) if (!vis[j] && (!u || dis[j] < dis[u])) u = j; vis[u] = true; for (auto [v, w] : G[u]) if (dis[u] + w < dis[v]) dis[v] = dis[u] + w; } }
intmain(){ std::cin.tie(0)->sync_with_stdio(0); std::cin >> n >> m >> s; for (int i = 0, u, v; i < m; ++i) { lint w; std::cin >> u >> v >> w; G[u].push_back({v, w}); } dijkstra(); for (int i = 1; i <= n; ++i) std::cout << dis[i] << " \n"[i == n]; std::cout.flush(); return0; }
#include<bits/stdc++.h> using lint = longlong; using pli = std::pair<lint, int>; const lint INF = 1e18; constint N = 1e5 + 10;
int n, m, s; lint dis[N]; std::vector<std::pair<int, lint>> G[N];
voiddijkstra(){ std::fill(dis + 1, dis + n + 1, INF); dis[s] = 0; std::priority_queue<pli, std::vector<pli>, std::greater<pli>> pq; pq.push({0, s}); while (!pq.empty()) { auto [d, u] = pq.top(); pq.pop(); if (d > dis[u]) continue; // 已经被更优的路径更新过 for (auto [v, w] : G[u]) { if (dis[u] + w < dis[v]) { dis[v] = dis[u] + w; pq.push({dis[v], v}); } } } }
intmain(){ std::cin.tie(0)->sync_with_stdio(0); std::cin >> n >> m >> s; for (int i = 0, u, v; i < m; ++i) { lint w; std::cin >> u >> v >> w; G[u].push_back({v, w}); } dijkstra(); for (int i = 1; i <= n; ++i) std::cout << dis[i] << " \n"[i == n]; std::cout.flush(); return0; }
关于
if (d > dis[u]) continue;
一个点可能被多次加入优先队列(每次被松弛都会入队)。当取出时发现
d > dis(u),说明已经有更优的路径更新过了,直接跳过。