题意:
给你一颗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下来就可以了。