转一篇CF题目的博客

题意:

给你一颗n(n<=10^5)个节点树根为1的树,然后进行dfs,求每个点,在dfs中被访问时间的期望。

 

let starting_time be an array of length n
current_time = 0
dfs(v):
	current_time = current_time + 1
	starting_time[v] = current_time
	shuffle children[v] randomly (each permutation with equal possibility)
	// children[v] is vector of children cities of city v
	for u in children[v]:
		dfs(u)

我们求的就是starting_time[v]的期望pv。

 

 

题解:

我们来求一下节点2的期望。

1、我们知道我们要先通过2节点的父亲1才能到2。但2节点什么时候访问是不固定的。

我们假设ri代表i为根的子树,我们能得到下列六种访问次序:

r2 r4 r5

r2 r5 r4

r4 r2 r5

r5 r2 r4

r4 r5 r2

r5 r4 r2

对应的2节点的starting_time[v]分别为2,2,5,3,6,6.我们能得到2节点的期望为p[2]=(2+2+5+3+6+6)/6=4.0

2、但是我们不能这样算,其实我们可以来算r4和r5给2节点的贡献:p[2]=p[1]+1+(3*size(r4)+3*size(r5))/6。

我们发现r4和r5各有一半的情况是出现在2节点的前面的。我们就得出了递推公式:

p[i]=p[fa[i]]+1+(size(fa[i])-size(i)-1)/2  从根节点dfs下来就可以了。

posted @ 2016-07-17 00:03  Commence  阅读(214)  评论(0编辑  收藏  举报