CF280C Game on Tree

题意:

给定一棵有根树,每次随机选取一个未删的点,把以它为根子树删除,求删除整棵树的期望步数

做法:

考虑贡献,每个点对答案贡献仅和点的祖先个数有关,这个点被选到当且仅当他的所有祖先没被选到,所以被选概率不是\(\large\frac1n\),而是\(\large\frac1{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);
}
posted @ 2020-10-19 10:18  INFP  阅读(80)  评论(0编辑  收藏  举报