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;
}
浙公网安备 33010602011771号