题意:
给定一棵有根树,每次随机选取一个未删的点,把以它为根子树删除,求删除整棵树的期望步数
做法:
考虑贡献,每个点对答案贡献仅和点的祖先个数有关,这个点被选到当且仅当他的所有祖先没被选到,所以被选概率不是(largefrac1n),而是(largefrac1{dep[x]})
根据期望的线性性((E(x+y)=E(x)+E(y)~~E(ax)=aE(x)~E(ax+by)=aE(x)+bE(y)))
,算出每个点被染黑的期望次数,求和即可
struct edge{int to,next;}e[N<<1]; int head[N],cnt;
inline void add(int u,int v){
e[++cnt] = (edge){v,head[u]}; head[u] = cnt;
}
int dep[N],n; double ans;
void dfs(int x,int fa){
dep[x] = dep[fa] + 1;
for(int i = head[x];i;i = e[i].next){
int v = e[i].to;
if(v == fa) continue;
dfs(v,x);
}
}
int main(){
n = read(); int u,v;
for(int i = 1;i < n;++i){
u = read(); v = read();
add(u,v); add(v,u);
}
dfs(1,1);
for(int i = 1;i <= n;++i) ans += (1.0/dep[i]);
printf("%.9lf",ans);
}