90分求条

P3275 [SCOI2011] 糖果

Cu Ball ```cpp #include <bits/stdc++.h> #define inf 0x3fffffff using namespace std; const int N = 1e5 + 5; int n, m, s, t, u, v, k, w, op; struct edge { int v, w; }; vector<edge> e[N]; stack<int> q; int dis[N], vis[N], cnt[N], b[N]; bool F = 1; void SPFA(int s) { q.push(s), vis[s] = 1, dis[s] = 0; while(q.size()) { int u = q.top(); q.pop(); vis[u] = 0, b[u] = 1; for(auto ed : e[u]) { int v = ed.v, w = ed.w; if(dis[v] < dis[u] + w) { cnt[v] = cnt[u] + 1, dis[v] = dis[u] + w; if(cnt[v] > n) { F ^= 1, cout << -1; return; } if(!vis[v]) q.push(v), vis[v] = 1; } } } } inline int read() { int x = 0, f = 1; char c = getchar(); while(!(c >= '0' && c <= '9')) { if(c == '-') f = -1; c = getchar(); } while(c >= '0' && c <= '9') x = (x << 1) + (x << 3) + c - '0', c = getchar(); return x * f; } signed main() { ios::sync_with_stdio(0); cin.tie(nullptr), cout.tie(nullptr); // freopen("std.in", "r", stdin); n = read(), m = read(); for(int i = 1; i <= m; ++i) { op = read(), u = read(), v = read(); if(op == 1) e[u].push_back({v, 0}), e[v].push_back({u, 0}); else if(op == 2) e[u].push_back({v, 1}); else if(op == 3) e[v].push_back({u, 0}); else if(op == 4) e[v].push_back({u, 1}); else e[u].push_back({v, 0}); } for(int i = 1; i <= n; ++i) e[0].push_back({i, 0}), dis[i] = -inf; SPFA(0); if(F ^ 1) return 0; int ans = 0; for(int i = 1; i <= n; ++i) ans += dis[i] + 1; cout << ans; return 0; } ``` @[zxjn](/user/891168) 已知的优化: - `queue` 换成 `stack`。 - `if` 比 `switch` 快。 - 要用 `cin` 就加个 `ios::sync_with_stdio(0)`。
by Walrus @ 2024-03-16 14:19:52


@[Walrus](/user/908424) ok
by zxjn @ 2024-03-16 14:24:54


|