Tree (树上期望dp)

本文介绍了如何利用动态规划解决树上的期望时间问题。通过将问题分解为子问题,得出每个节点到达其父节点的期望时间和返回的期望时间,最终推导出复杂度为O(n)的解决方案。
摘要由CSDN通过智能技术生成

Tree

11.2 和 11.3

11.2

考虑1个随机过程,第1次走到u号点的时间可以分成两部分,第1部分是从1号点随机游走第1次走到u的父亲p的时间,第2部分是从p开始走,第1次走到u的时间,由期望的线性性,第1次走到u的时间期望等于这两部分期望的和。第1部分是一个子问题,我们考虑怎么解决第2部分,我们把这个问题变成1棵树(并且根节点脑袋上也有1条边),从根节点开始随机游走,走出这棵树期望的时间,我们x[u]表示这个期望,我们对u的子树中的点也类似地定义x[v],这样我们可以列出关系式:

这里写图片描述

其中d是的u度数(包括那根天线),这个关系是中的第一个1表示直接向上.,后面那个扩号中的三部分,那个1表示从u走向v, x[v]表示从v回来期望时间, x[u]表示这个时候继续走,走出去还需要花的时间。因为是等概率,所以直接乘以1/d这个概率即可。化简后是:

这里写图片描述

即x[u]等于这棵子树的所有节点度的和,考虑到除了那根天线之外,所有的边对度的贡献为2,所以:

这里写图片描述

这样,子问题就有了一个简单的答案了。我们回到原问题,dp[u]表示第一次走到u的期望时间,p表示u的父亲,有:

这里写图片描述

完美解决了这个问题,复杂度O(n),其实答案都是整数,那三位小数也是来骗你的^_^。

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#define LL long long
#define N 1000010
using namespace std;

int n, idc=0, idx=0;
int head[N], siz[N], fa[N], seq[N];
LL ans[N];

struct Edge{
    int to, nxt;
}ed[N];

void adde(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值