zoukankan      html  css  js  c++  java
  • 树上两点期望距离

    对于树上的节点(i),设(d[i])(i)的度数,(fa)(i)的父亲,(sumlimits_{son} j)(i)的儿子。

    假设边权均为(1)

    分别考虑儿子到父亲、父亲到儿子的期望。


    (F[i])表示儿子(i)到父亲的期望距离。

    可以分为(2)种情况:

    1. 直接到父亲。

      概率为(dfrac{1}{d[i]}),步数为(1),期望为(dfrac{1}{d[i]})

    2. 先到儿子(j),再回到自己,再到父亲。

      • 走到儿子,步数为(1)
      • 回到自己,步数为(F[j])
      • 走到父亲,步数为(F[i])

      概率为(dfrac{sumlimits_{son}}{d[i]}),步数为(1+F[j]+F[i]),期望为(dfrac{sumlimits_{son}{(1+F[j]+F[i])}}{d[i]})

    综上,

    (F[i] = dfrac{1+sumlimits_{son}{(1+F[j]+F[i])}}{d[i]})

    移项可得:

    (F[i] = d[i] + sumlimits_{son} F[j])


    (G[i])表示父亲到儿子(i)的期望距离。

    可以分为(3)种情况:

    1. 直接到该儿子。

      概率为(dfrac{1}{d[fa]}),步数为(1),期望为(dfrac{1}{d[fa]})

    2. 先到父亲,再回到自己,再到该儿子。

      • 走到父亲,步数为(1)
      • 回到自己,步数为(G[fa])
      • 走到该儿子,步数为(G[i])

      概率为(dfrac{1}{d[fa]}),步数为(1+G[fa]+G[i]),期望为(dfrac{1+G[fa]+G[i]}{d[fa]})

    3. 先到另一个儿子,再回到自己,再到该儿子。

      • 走到另一个儿子,步数为(1)

      • 回到自己,步数为(F[j])

      • 走到该儿子,步数为(G[i])

      概率为(dfrac{sumlimits_{son ot=i}}{d[fa]}),步数为(1+F[j]+G[i]),期望为(dfrac{sumlimits_{son ot=i}(1+F[j]+G[i])}{d[fa]})

    综上,

    (G[i] = dfrac{1+(1+G[fa]+G[i])+sumlimits_{son ot=i}(1+F[j]+G[i])}{d[fa]})

    移项可得:

    (G[i] = G[fa]+d[fa]+sumlimits_{son ot=i}F[j])


    将路径(u ightarrow v)拆成(u ightarrow LCA)(LCA ightarrow v)

    路径(u ightarrow LCA)为儿子到父亲,路径(LCA ightarrow v)为父亲到儿子。

    所以,答案即为:

    $sumlimits_{u ightarrow LCA}F[i] + sumlimits_{LCA ightarrow v}G[i] $

    其中(F[叶子节点]=1)(G[根节点]=1)

    用树上前缀和维护即可。

    (ans = F[u]+G[v]-F[LCA]+G[LCA])

  • 相关阅读:
    关于IE6不能兼容LCUC使用的PNG透明图象
    rmvb压制中高级技巧
    不错的课件网站
    C#程序多用户只启动一个进程的方法
    不可想像的加密光盘复制工具
    检测远程URL是否存在的三种方法
    请哪里有英文单词单复数转换的代码?
    一些感想,欢迎拍砖
    Some thoughts on my own O/R Mapping or Code Generation tools
    有了net send,谁还用IM?
  • 原文地址:https://www.cnblogs.com/mogeko/p/13414230.html
Copyright © 2011-2022 走看看