TopCoder SRM 561 Orienteering 树形Dp
TopCoder SRM 561 Orienteering 树形dp
题意: 给定了一棵树,以及树上一些节点为关键点,求出随机选出$k$个关键点后遍历它们的最短路径的期望
遍历关键点相当于要遍历一棵树,考虑遍历一棵树的最优决策
假设我们确定了一个根$u$,递归考虑每棵子树的问题
发现除了最后留在的那个点对应的路径$(u,v)$以外,所有的边都要被遍历两次
即答案$\sum _{e\in E} 2\cdot w(e)-dis(u,v)$
所以改变根就会发现,答案就是总长*2-直径长度
设总点数为$n$,包含的总关键点数为$m$,要选出$k$个点
Part1 总长计算
考虑对于每一条边计算产生的树跨过它的概率
设这条边两边的关键点的个数分别为$a,b(a+b=m)$
显然,这条边被跨过的概率就是
$\begin{aligned} 1-\frac{C(a,k)} {C(m,k)}-\frac{C(b,k)} {C(m,k)}\end{aligned}$ (即减去所有选出的关键点都在两边的概率) 设$\begin{aligned} f(i)=\frac{C(i,k)} {C(m,k)}=\frac{i!(m-k)!} {m!(i-k)!}\end{aligned} $因为这个题目要计算double,所以求阶乘的精度会比较有问题
考虑递推求出$f(i)$,则有
$f(i)=\left\{\begin{aligned}1 && i=m \\ \frac{f(i+1)(i+1-k)} {i+1} && iPart2 直径长度计算
直径似乎是一个很难在树形$\mathrm{dp}$中确定的东西,因此考虑直接先枚举直径的两个端点
定义一棵树的直径两端点为最小的二元组$(A,B)$满足
$\begin{aligned} A因为$k>1$,所以两端点一定不同,不妨设两个端点分别为$A,B(A<B)$则一个点$C$可以出现在树上的充要条件是
$(dis(A,C)>dis(A,B) \or dis(A,C)=dis(A,B)\and C \ge B)$
$\and (dis(B,C)>dis(A,B) \or dis(B,C)=dis(A,B)\and C \ge A)$
数出所有可以出现在树上的点个数$i$,则$(A,B)$为直径的概率应为$\frac{C(i-2,k-2)} {C(m,k)}$
即强制选取了$(A,B)$两个点
依然考虑递推求出
$\begin{aligned} f(i)=\frac{C(i-2,k-2)} {C(m,k)}=\frac{(i-2)!k(k-1)(m-k)!} {m!(i-k)!}\end{aligned}$类似地,得到其递推式为
$f(i)=\left\{\begin{aligned}\frac{k(k-1)} {m(m-1)} && i=m \\ \frac{f(i+1)(i+1-k)} {i-1} && i1 |
|
$\frac{C(i,k)} {C(m,k)}=\frac{i!(m-k)!} {m!(i-k)!}$
i从m for 到 k
f(i)=f(i+1)/i(k-i+1)
$\frac{C(i-2,k-2)} {C(m,k)}=\frac{(i-2)!k(k-1)(m-k)!} {m!(i-k)!}$
i=m时,$f(m)=\frac{k(k-1)} {m(m-1)}$