[P6154] 游走

[P6154] 游走 - 期望

Description

给定一个有向无环图,求其中一条路径长度的期望。

Solution

一条路径长度的期望 = 所有路径长度和 / 所有路径条数

计算这两个东西用 dp,设 (f[i]) 为 i 出发的路径的长度和,(c[i]) 为 i 出发的路径的条数

转移时,(f[i]) 为所有后继的路径长度和 + 所有后继的路径条数和,(g[i]) 为所有后继路径条数和 +1

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N = 1000005;
const int mod = 998244353;

int qpow(int p, int q) { return (q & 1 ? p : 1) * (q ? qpow(p * p % mod, q / 2) : 1) % mod; }
int inv(int p) { return qpow(p, mod - 2); }

int n, m;
vector<int> g[N];

int f[N], c[N];

void dfs(int p)
{
    c[p] = 1;
    for (auto q : g[p])
    {
        if (c[q] == 0)
            dfs(q);
        f[p] += f[q] + c[q];
        c[p] += c[q];
    }
    f[p] %= mod;
    c[p] %= mod;
}

signed main()
{
    ios::sync_with_stdio(false);
    cin >> n >> m;
    for (int i = 1; i <= m; i++)
    {
        int t1, t2;
        cin >> t1 >> t2;
        g[t1].push_back(t2);
    }
    for (int i = 1; i <= n; i++)
        if (c[i] == 0)
            dfs(i);
    int sf = 0, sc = 0;
    for (int i = 1; i <= n; i++)
        sf += f[i], sc += c[i];
    sf %= mod;
    sc %= mod;
    cout << sf * inv(sc) % mod << endl;
}
原文地址:https://www.cnblogs.com/mollnn/p/14469429.html