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;
}
posted @ 2019-03-26 16:02  dreagonm  阅读(216)  评论(1编辑  收藏  举报