树上期望距离

Posted luoshuitianyi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树上期望距离相关的知识,希望对你有一定的参考价值。

树上期望距离

设:

  • (d[i]):节点 (i) 的度数
  • (fa[i]):节点 (i) 的父亲

我们分为两个部分:儿子到父亲与父亲到儿子。

儿子到父亲

我们先设 (f[i])(i)(fa[i]) 的期望移动步数。

显然,分为两种情况:

  • 一步走到父亲

对于这种情况,只需要走一步即可到达父亲节点,而这种概率为 (frac{1}{d[i]}) ,长度则为 (1) 。那么贡献期望长度为 (frac {1}{d[i]})

  • 先走到 (i) 的某个儿子,然后再走回来。

对于这种情况,贡献期望长度当然为:

(走到儿子的步数+儿子走到 (i) 的步数+ (i) 到父亲的步数)/ (d[i])

由于现在走到儿子已经是个钦定的事情,那么步数为 (1) ,而儿子走到 (i) 的步数则必定为 (f[son])(i) 到父亲的步数则一定是 (f[i]) ,是不是看起来重复了 (f[i]) ,挺绕的 ?

那么易得 (f[i]=frac{1+sum (f[son]+f[i]+1)}{d[i]}) ,即是将两个情况的贡献加在一起。由于 (i) 的儿子数肯定为 (d[i]-1) 我们考虑化简这个式子,拆出 (sum) 中的 (1)(f[i])
[ f[i]=frac{1+sum (f[son]+f[i]+1)}{d[i]}f[i]=frac{1+d[i]-1+(d[i]-1)*f[i]+sum f[son]}{d[i]}f[i]=frac{d[i]+sum f[son] +(d[i]-1)*f[i]}{d[i]} ]
接着我们将右边的 (f[i]) 拆下来移项至左边:
[ f[i]=frac{d[i]+sum f[son]}{d[i]}+frac{(d[i]-1)*f[i]}{d[i]}\frac{f[i]}{d[i]}=frac{d[i]+sum f[son]}{d[i]} ]
最后即可得到式子:
[ f[i]=d[i]+sum f[son] ]

父亲到儿子

我们设 (g[i])(i) 的父亲移动到 (i) 的期望步数,并设 (i) 的父亲为 (x)

那么有三种情况:

  • (x) 直接一步移动到 (i)

这种情况下肯定为 (frac{1}{d[i]}) 的贡献。

  • (x) 先移动到 (fa[x]) ,然后再移动回 (x) 再移动到 (i)

当然我们的长度肯定为:移动到 (fa[x]) 的步数+(fa[x]) 移动回 (x) 的步数+ (x) 移动到 (i) 的步数

(=(1+g[x]+g[i])/d[i])

  • (x) 先移动到除了 (i) 之外的其他儿子之一,再移动回 (x) 再移动到 (i)

长度为:移动到儿子的步数+儿子移动回 (x) 的步数+(x) 移动到 (i) 的步数

(=(1+f[son]+g[i])/d[i])

那么贡献之和为:
[ g[i]=frac{1+(1+g[x]+g[i])+sum_{son eq i}(1+f[son]+g[i])}{d[i]} ]
由于 (x)(i) 以外的儿子个数为 (d[x]-2) ,那么可以如法炮制,像 (f) 数组那样化简:
[ g[i]=frac{2+g[x]+g[i]+d[x]-2+(d[x]-2)*g[i]+sum_{son eq i}f[son]}{d[i]} ]
消项移项可得:
[ g[i]=g[x]+d[x]+sum_{son eq i}f[son] ]

距离计算

对于给定的 (u->v) 这样一条树上路径,我们可以拆成两条:

(u->lca)(lca->v)

对于第一条路径,肯定是全程向上的,对于第二条路径,肯定是全程向下的。

那么长度肯定为:
[ sum_{iin (u->lca)} f[i] +sum_{iin(lca->v)}g[i]-f[lca]-g[lca] ]
则我们可以使用树上前缀和记录每个点到根节点的 (f)(g) 之和,接下来就能够利用前缀和快速求出 (sum) 的值了。













以上是关于树上期望距离的主要内容,如果未能解决你的问题,请参考以下文章

树上随机游走的期望距离

最小生成树+树上任意两点的最小期望

BZOJ4675点对游戏 树分治+期望

poj 2057 树形DP,数学期望

loj 2542 随机游走 —— 最值反演+树上期望DP+fmt

对随机游走问题期望距离的估计