SPFA
const int inf = 1e9;struct Graph { int n; vector<vector<pair<int, int>>> adj; Graph(int n_) { n = n_; adj.resize(n + 1, {}); } bool spfa(int s) { vector<int> d(n + 1, inf), vis(n + 1), cnt(n + 1); queue<int> q; q.emplace(s); vis[s] = 1; d[s] = 0; while (!q.empty()) { int u = q.front(); q.pop(); vis[u] = false; for (auto [v, w] : adj[u]) { if (d[v] > d[u] + w) { d[v] = d[u] + w; cnt[v] = cnt[u] + 1; if (cnt[v] >= n + 10) { // 一定是>=总点数! return false; } if (!vis[v]) { q.emplace(v); vis[v] = true; } } } } return true; } void addEdge(int u, int v, int w) { adj[u].emplace_back(v, w); }};