[CF280C] Game on Tree - 拆贡献,期望
Description
给出一棵树,每次随机等概率选择一未染黑的点,将它及其子树染黑。问期望多少次操作可以将树全部染黑。
Solution
按惯例拆贡献,转化为每个点被染色次数的期望的和
一个点会被染色,当且仅当它的所有祖先没有在它之前被染色
换言之现在有个随机排列,我们问的就是某个元素出现在另外一些元素之前的概率
因此一个点的贡献就是它深度的倒数
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1000005;
int n;
vector<int> g[N];
int dep[N];
void dfs(int p, int from)
{
for (int q : g[p])
{
if (q == from)
continue;
dep[q] = dep[p] + 1;
dfs(q, p);
}
}
signed main()
{
ios::sync_with_stdio(false);
cin >> n;
for (int i = 1; i < n; i++)
{
int t1, t2;
cin >> t1 >> t2;
g[t1].push_back(t2);
g[t2].push_back(t1);
}
dep[1] = 1;
dfs(1, 0);
double ans = 0;
for (int i = 1; i <= n; i++)
ans += 1.0 / dep[i];
cout << fixed << setprecision(12) << ans << endl;
}