1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| struct SPFA { struct node { int to, w; };
int n; std::vector<std::vector<node>> adj; std::vector<int> dist; std::vector<int> cnt; std::vector<int> st;
SPFA() {} SPFA(int n) { init(n); }
void init(int n) { this -> n = n; adj.resize(n); dist.assign(n, INF); cnt.assign(n, 0); st.assign(n, 0); }
void addEdge(int u, int v, int w) { adj[u].push_back({v, w}); }
bool spfa(int start = 0) { dist[start] = 0; std::queue<int> que; que.push(start); st[start] = 1;
while (que.size()) { auto u = que.front(); que.pop(); st[u] = 0;
for (auto [v, w] : adj[u]) { if (dist[v] > dist[u] + w) { dist[v] = dist[u] + w; cnt[v] = cnt[u] + 1; if (cnt[v] >= n) { return false; } if (!st[v]) { que.push(v); st[v] = 1; } } }
} return true; } };
|