Codeforces.280C.Game on Tree(期望)

题目链接

参考:浅谈期望的线性性(可加性)
Codeforces 280C Game on Tree 概率dp 树上随机删子树 求删完次数的期望(这个的前半部分分析并没有看。。)

\(Description\)
给你一棵有\(n\)个白点的有根树,每次随机选择一个点,将它和它的子树中所有点染黑。
问期望操作多少次后所有点都被染黑?

\(Solution\)
期望好玄啊。。(好吧是我太弱)
因为概率具有可加性,一棵树可以分解为多棵子树,而子树分解的最终状态就是点,所以我们可以计算每个点的期望操作次数再求和,即\[E(总操作次数)=\sum E(每个点被选中操作次数)\]
这个期望操作次数是指作为白点被选中染黑的期望次数。
因为一个点祖先节点被染黑后,这个节点操作次数就为0了,所以得出一个点x的期望E(x)=1/dep[x].
直接DFS。。

//62ms  9872KB
#include <cstdio>
#include <cctype>
#define gc() getchar()
const int N=1e5+5;

int n,Enum,H[N],nxt[N<<1],to[N<<1];
double Ans;

inline int read()
{
    int now=0;register char c=gc();
    for(;!isdigit(c);c=gc());
    for(;isdigit(c);now=now*10+c-'0',c=gc());
    return now;
}
inline void AddEdge(int u,int v)
{
    to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum;
    to[++Enum]=u, nxt[Enum]=H[v], H[v]=Enum;
}
void DFS(int x,int f,int d)
{
    Ans+=1.0/d;
    for(int i=H[x]; i; i=nxt[i])
        if(to[i]!=f) DFS(to[i],x,d+1);
}

int main()
{
    n=read();
    for(int u,v,i=1; i<n; ++i) u=read(),v=read(),AddEdge(u,v);
    DFS(1,1,1);
    printf("%.10lf",Ans);

    return 0;
}

转载于:https://www.cnblogs.com/SovietPower/p/8674775.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值