树上随机游走


给定一棵树,树的某个结点上有一个硬币,在某一时刻硬币会等概率地移动到邻接结点上,问硬币移动到邻接结点上的期望距离。

需要用到的定义

  • : 所讨论的树
  • : 结点的度数
  • : 结点与 结点之间的边的边权
  • : 结点的父结点
  • : 结点的子结点集合
  • : 结点的兄弟结点集合

向父结点走的期望距离

代表 结点走到其父结点 的期望距离,则有:

分子中的前半部分代表直接走向了父结点,后半部分代表先走向了子结点再由子结点走回来然后再向父结点走;分母 代表从 结点走向其任何邻接点的概率相同。

化简如下:

初始状态为

当树上所有边的边权都为 时,上式可化为:

子树的所有结点的度数和,也即 子树大小的两倍 (每个结点连向其父亲的边都有且只有一条,除 之间的边只有 点度数的贡献外,每条边会产生 点度数的贡献)。

向子结点走的期望距离

代表 结点走到其子结点 的期望距离,则有:

分子中的第一部分代表直接走向了子结点 ,第二部分代表先走向了父结点再由父结点走回来然后再向 结点走,第三部分代表先走向 结点的兄弟结点再由其走回来然后再向 结点走;分母 代表从 结点走向其任何邻接点的概率相同。

化简如下:

初始状态为

代码实现(以无权树为例)

vector<int> G[maxn];

void dfs1(int u, int p) {
  f[u] = G[u].size();
  for (auto v : G[u]) {
    if (v == p) continue;
    dfs1(v, u);
    f[u] += f[v];
  }
}

void dfs2(int u, int p) {
  if (u != 1) g[u] = g[p] + f[p] - f[u];
  for (auto v : G[u]) {
    if (v == p) continue;
    dfs2(v, u);
  }
}

贡献者:@queenwen@AgOH

本页面最近更新:2/3/2023, 12:00:00 AM更新历史

发现错误?想一起完善? 在 GitHub 上编辑此页!

本页面的全部内容在 CC BY-SA 4.0SATA 协议之条款下提供,附加条款亦可能应用

评论

0 条评论
未登录用户


Copyright © 2016 - 2023 OI Wiki Team

最近更新:fd2ec2c, 2023-02-03

联系方式:Telegram 群组 / QQ 群组