AGC049A 題解

adam01發表於2024-08-03

弱化版:CF280C Game on Tree(有向圖的限制變成一棵根節點為 1 的外向樹)

弱化版解法:

根據期望線性性,\(Ans=\sum_{i=1}^nE(p_i)\)

其中 \(p_i\)\(i\) 被選到的機率。

因為對於 \(i\)\(i\) 的祖先節點,某個點在這些店裡是第一個備選的機率相同。所以 \(p_i=\dfrac{1}{dep_i}\)

所以答案就是 \(\sum_{i=1}^n\dfrac{1}{dep_i}\)

回到這道題,根據上面結論,\(p_i=\dfrac{1}{可以到達i的點的個數}\)

直接 bitset 傳遞閉包。

複雜度 \(O\left(\dfrac{n^3}{w}\right)\)

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

const int N = 105;
int n;

long double ans;
vector<int> e[N];
int deg[N];
bitset<N> g[N];

signed main()
{
    ios::sync_with_stdio(0);cin.tie(0);
    cin >> n;
    for(int i = 1; i <= n; i ++)
    {
        string s; cin >> s;
        g[i][i] = 1;
        for(int j = 1; j <= n; j ++)
            if(s[j - 1] == '1')
                g[j][i] = 1;
    }
    for(int i = 1; i <= n; i ++)
    for(int j = 1; j <= n; j ++)
        if(g[j][i]) g[j] |= g[i];
    for(int i = 1; i <= n; i ++)
        ans += 1.L / g[i].count();
    printf("%.20Lf", ans);

    return 0;
}