1 条题解
-
0
有向无环图随机游走(Random Walk on DAG) 题解
思路分析
按题目要求使用对应数据结构与算法模拟/递推求解,注意数据范围边界与时间复杂度。
参考代码
#include <iostream> #include <queue> #include <vector> using namespace std; const int MOD = 998244353; long long qpow(long long a, long long b) { long long res = 1; while (b > 0) { if (b & 1) res = res * a % MOD; a = a * a % MOD; b >>= 1; } return res; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, m; if (!(cin >> n >> m)) return 0; vector<vector<int>> adj(n + 1); vector<int> indeg(n + 1, 0); for (int i = 0; i < m; ++i) { int u, v; cin >> u >> v; adj[u].push_back(v); indeg[v]++; } queue<int> q; vector<int> ord; ord.reserve(n); for (int i = 1; i <= n; ++i) { if (indeg[i] == 0) q.push(i); } while (!q.empty()) { int u = q.front(); q.pop(); ord.push_back(u); for (int v : adj[u]) { if (--indeg[v] == 0) q.push(v); } } vector<long long> cnt(n + 1, 1), sum(n + 1, 0); for (int i = n - 1; i >= 0; --i) { int u = ord[i]; for (int v : adj[u]) { cnt[u] = (cnt[u] + cnt[v]) % MOD; sum[u] = (sum[u] + sum[v] + cnt[v]) % MOD; } } long long tot_cnt = 0, tot_sum = 0; for (int i = 1; i <= n; ++i) { tot_cnt = (tot_cnt + cnt[i]) % MOD; tot_sum = (tot_sum + sum[i]) % MOD; } cout << tot_sum * qpow(tot_cnt, MOD - 2) % MOD << "\n"; return 0; }
- 1
信息
- ID
- 8612
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者