Problem
求树上两点之间的期望距离。
Solution
设d[i]为i节点的度数。
fa[i]为i节点的父亲。
我们对于两种不同的走法分别考虑。
Part1:儿子到父亲
设此时期望步数为f[i]。
显然,只会有两种情况:
1.直接一步走到父亲。
2.先走到自己的儿子,再走回自己,再走到父亲。
对于情况1.概率为$ \frac{1}{d[i]}$,步数为1,期望为$ \frac{1}{d[i]}$。
对于情况2.分步考虑:
$1^{st}$:走到儿子,发生概率为$ \frac{d[i]-1}{d[i]}$,步数为1,期望为$ \frac{d[i]-1}{d[i]}$
$2^{nd}$:儿子走到自己,期望为$ \sum\limits_{j∈i的儿子}\frac {f[j]}{d[i]}$
$3^{rd}$:自己走到父亲,期望为$ \frac{(d[i]-1)×f[i]}{d[i]}$
综上,我们有:
移项化简之后我们得到:
Part2:父亲到儿子。
设此时期望步数为g[i]。
那么,我们有三种情况
1.直接跳到指定的儿子。
2.跳到父亲的父亲,再回到该点,再到达指定儿子。
3.跳到另一个儿子,再跳回来,再到达指定儿子。
还是像f数组一样讨论即可。
化简后:
好了,两种情况都考虑完之后,就可以算距离了。
距离计算
对于给定的u—->v的路径,我们可以拆成两条:$u \to LCA$; $LCA\to v$。
其中对于第一条路径,肯定都是向上走,另一条则是向下的。
所以:
记一个树上前缀和即可。
Code
1 |
|