// DP 更新 low[u] for (auto& v : E[u]) { if (dfn[v] == -1) dfs(v), low[u] = min(low[u], low[v]); elseif (bel[v] == -1) low[u] = min(low[u], dfn[v]); }
// u 是 SCC 的根 if (dfn[u] == low[u]) { int v; do { v = stk.back(); stk.pop_back(); // 出栈 bel[v] = tot; // 记录 u 的子节点的根为 u } while (v != u); // 不断弹出直到根 u 弹出为止 tot++; // 记录 SCC 的数量 } }
structGraph { int n; vector<vector<int>> E; vector<int> ecnt, pcnt, bel; Graph(int n) : n(n), E(n), ecnt(n), pcnt(n) {} }; Graph work(){ for (int u = 0; u < n; u++) { if (dfn[u] == -1) dfs(u); } Graph G(tot); G.bel = bel; for (int u = 0; u < n; u++) { for (auto& v : E[u]) { if (bel[u] != bel[v]) G.E[bel[u]].push_back(bel[v]); // bel[u] 总是小于 p[v] else G.ecnt[bel[u]]++; } G.pcnt[bel[u]]++; } for (auto& vec : G.E) { sort(vec.begin(), vec.end()); vec.erase(unique(vec.begin(), vec.end()), vec.end()); } return G; }
template<typename T> vector<T> compress(const vector<T>& w){ vector<T> res(tot); for (int u = 0; u < n; u++) { res[bel[u]] += w[u]; } return res; } };
intmain(){ SCC scc(n); while (m--) { int u, v; cin >> u >> v; u--, v--; scc.add(u, v); } auto G = scc.work(); w = scc.compress(w); n = G.n; }
vector<int> deg(n); while (m--) { int u, v; cin >> u >> v; E[u].push_back(v); deg[v]++; } queue<int> Q; vector<int> dp(n); for (int u = 0; u < n; u++) { if (deg[u] == 0) Q.push(u), /* 初始化 dp */; } while (!Q.empty()) { int u = Q.front(); Q.pop(); for (auto v : E[u]) { /* DP 转移 */; if (--deg[v] == 0) Q.push(v); } }
queue<int> Q; vector<int> dp(n); for (int u = 0; u < n; u++) { if (deg[u] == 0) Q.push(u), dp[u] = 1; } while (!Q.empty()) { int u = Q.front(); Q.pop(); for (int v : E[u]) { (dp[v] += dp[u]) %= mod; if (--deg[v] == 0) Q.push(v); } } int res = 0; for (int u = 0; u < n; u++) { if (E[u].empty()) (res += dp[u]) %= mod; } cout << res << endl;
int n, m; cin >> n >> m; vector<ll> w(n); for (int i = 0; i < n; i++) { cin >> w[i]; } // SCC add, work, compress vector<pair<int, ll>> dp(n); for (int u = n - 1; u >= 0; u--) { dp[u].first += G.pcnt[u]; // 链的长度 dp[u].second -= w[u]; // 边权和 for (auto v : G.E[u]) { dp[v] = max(dp[v], dp[u]); } }
auto res = *max_element(dp.begin(), dp.end()); cout << res.first << " " << -res.second << endl;
queue<int> Q; vector<int> path; bool unique = true; int cnt = 0; for (int u = 0; u < n; u++) { if (deg[u] == 0) Q.push(u), cnt++; } if (cnt > 1) unique = false; while (!Q.empty()) { int u = Q.front(); Q.pop(); path.push_back(u); int cnt = 0; for (int v : E[u]) { if (--deg[v] == 0) Q.push(v), cnt++; } if (cnt > 1) unique = false; }
vector<vector<pair<int, int>>> E(n); SCC G(n); while (m--) { int u, w; cin >> u >> w; int v = u + w; u = (u % n + n) % n; v = (v % n + n) % n; G.add(u, v); E[u].push_back({ w, v }); }
// DFS 定权 vector<ll> val(n, inf); auto dfs = [&](auto&& self, int u) -> void { for (auto [w, v] : E[u]) { if (val[v] == inf) { val[v] = val[u] + w; self(self, v); } } }; for (int u = 0; u < n; u++) { if (val[u] == inf) { val[u] = 0; dfs(dfs, u); } }
auto g = G.work();
// BFS 定权 很有可能出问题 vector<ll> val(n, inf); auto g = scc.work(); for (int u = 0; u < n; u++) { if (val[u] != inf) continue; val[u] = 0; queue<int> Q; Q.push(u); while (!Q.empty()) { int u = Q.front(); Q.pop(); for (auto [w, v] : E[u]) { if (val[v] != inf) continue; if (g.bel[u] != g.bel[v]) continue; // WA val[v] = val[u] + w; Q.push(v); } } }
vector<int> dp(g.n); for (int u = 0; u < n; u++) { for (auto [w, v] : E[u]) { if (g.bel[u] == g.bel[v] && val[u] + w != val[v]) { dp[g.bel[u]] = 1; } } }
for (int u = 0; u < g.n; u++) { for (auto v : g.E[u]) { dp[u] |= dp[v]; } }
while (q--) { int u; cin >> u; u = (u % n + n) % n; cout << (dp[g.bel[u]] ? "Yes" : "No") << endl; }