树上随机游走
给定一棵有根树,树的某个结点上有一个硬币,在某一时刻硬币会等概率地移动到邻接结点上,问硬币移动到邻接结点上的期望距离。
需要用到的定义
: 所讨论的树 : 结点 的度数 : 结点 与结点 之间的边的边权 : 结点 的父结点 : 树的根结点 : 结点 的子结点集合 : 结点 的兄弟结点集合
向父结点走的期望距离
设
分子中的前半部分代表直接走向了父结点,后半部分代表先走向了子结点再由子结点走回来然后再向父结点走;分母
化简如下:
对于叶子结点
当树上所有边的边权都为
即
向子结点走的期望距离
设
分子中的第一部分代表直接走向了子结点
化简如下:
初始状态为
代码实现(以无权树为例)
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 != root) g[u] = g[p] + f[p] - f[u];
for (auto v : G[u]) {
if (v == p) continue;
dfs2(v, u);
}
}
最后更新: 2024年10月9日
创建日期: 2022年9月29日
创建日期: 2022年9月29日