弱化版: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;
}