CF280C
题目大意:
给定n个点的一棵树
每次操作随机选任意一个点,把这个点和这个点的子树删去。
当把所有点删去则停止。
问操作次数的期望。
做法:
我是sb,我是sb,我是sb。。。。
这种没有智力的题目都要想这么久,没希望了
显然期望次数=sigma(每个点自己把自己删除的期望)
显然一个点自己把自己删除的期望就是1/祖先个数+1
然后就是sigma(1/depth[i])
代码:
#include<bits/stdc++.h> #define N 500005 using namespace std; int n,x,y,head[N],depth[N],kk; double ans; struct Tree{int nxt,to;}e[N]; inline void link(int x,int y){e[++kk].nxt=head[x];e[kk].to=y;head[x]=kk;} void dfs(int u,int fa){ for (int i=head[u];i;i=e[i].nxt){ int v=e[i].to; if (v==fa) continue; depth[v]=depth[u]+1; dfs(v,u); } } int main(){ scanf("%d",&n); for (int i=1;i<n;i++){ scanf("%d%d",&x,&y); link(x,y);link(y,x); } depth[1]=1;dfs(1,-1); for (int i=1;i<=n;i++) ans=ans+1.0*1/depth[i]; printf("%.20lf\n",ans); return 0; }