// FIFO SPFA;输入必须没有源点可达的负环,最坏时间 O(nm)。 // 输入输出同 P3371;一般负权图应使用第 4 份中的判环版本。 #include #include #include using namespace std; using ll = long long; struct Edge { int to; ll w; }; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, m, s; if (!(cin >> n >> m >> s)) return 0; vector> g(n + 1); for (int i = 0; i < m; ++i) { int u, v; ll w; cin >> u >> v >> w; g[u].push_back({v, w}); } const ll INF = (1LL << 60); vector dis(n + 1, INF); vector in_queue(n + 1, false); queue q; dis[s] = 0; q.push(s); in_queue[s] = true; while (!q.empty()) { int u = q.front(); q.pop(); in_queue[u] = false; // 离队后仍允许再次排队 for (const auto &e : g[u]) { int v = e.to; ll nd = dis[u] + e.w; if (nd < dis[v]) { dis[v] = nd; // 已在队列中也必须更新距离 if (!in_queue[v]) { q.push(v); in_queue[v] = true; } } } } for (int i = 1; i <= n; ++i) cout << (dis[i] == INF ? 2147483647LL : dis[i]) << (i == n ? '\n' : ' '); }