CF280C Game on Tree
题意
给出一棵树,每次随机等概率选择一未染黑的点,将它及其子树染黑。问期望多少次操作可以将树全部染黑。
思路
题目要求求出的相当于每次随机删除一颗子树,问删除掉整棵树的期望次数
由于期望的线性性质,可以考虑求出每个点被删除的期望代价,再求和即可得出答案,每个点被删除的期望代价=能删除这个点的每种方法的代价之和 除以 总的方法数
然后由于删除一个点要么删它本身,要么删它的祖先,所以总共有点的深度种方法,只有在刚好删除这个点的时候才会产生1的代价
所以答案就是
\[ans=\sum_{i}\frac{1}{dep_i}
\]
代码
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int n,v[200100],fir[200100],nxt[200100],cnt;
double ans=0;
void addedge(int ui,int vi){
++cnt;
v[cnt]=vi;
nxt[cnt]=fir[ui];
fir[ui]=cnt;
}
void dfs(int u,int f,int d){
ans=ans+(1.0/d);
for(int i=fir[u];i;i=nxt[i])
if(v[i]!=f)
dfs(v[i],u,d+1);
}
int main(){
scanf("%d",&n);
for(int i=1;i<n;i++){
int a,b;
scanf("%d %d",&a,&b);
addedge(a,b);
addedge(b,a);
}
dfs(1,0,1);
printf("%.20lf\n",ans);
return 0;
}