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;
}

  

猜你喜欢

转载自www.cnblogs.com/ckr1225/p/9092389.html