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; }