CodeForces 1060F. Shrinking Tree
题目简述:给定一棵$n\leq 50$个节点的树。树的缩小过程则是重复以下操作直到仅剩下一个节点为止:
等概率随机选择一条边$(u, v)$,然后将节点$u$和节点$v$合并成一个新的节点$w$,所有与节点$u$或节点$v$相连的边都改为与节点$w$相连,并且以相同的概率将新的节点$w$仍然标记为节点$u$或节点$v$。
对每个$i$,求最后剩下节点$i$的概率。
解:code
建模:
设树为$T = (V, E)$,一次缩小操作后树变为$T' = (V', E')$,记作$T' = \text{shrink}(T)$。对$i \geq 1$,令$T_i = \text{shrink}(T_{i-1})$,特别地,$T_0 = T$。则$T_0, T_1, \dots, T_{n-1}$是一个Markov过程。最后剩下节点$u \in V$的概率为$\Pr[u \in T_{n-1}]$。
设$T$的根节点为$r$,对任意节点$u$,记$T_u$表示$T$中以$u$为根节点的子树。定义$f[u][i]$表示:若只考虑$T_u$的缩小过程,在条件【在这过程中仅剩恰好$i$条边时,节点$u$仍然存在】下,最后剩下节点$u$的概率。形式化地说,
$$ f[u][i] = \Pr[ u \in \text{shrink}^{\text{size}(u)-1}(T_u) | u \in \text{shrink}^{\text{size}(u)-i-1}(T_u) ]. $$
其中$\text{shrink}^{k}(T)$表示$\text{shrink}$作用在$T$上$k$次,即$\text{shrink}^{k}(T) = \text{shrink}(\text{shrink}^{k-1}(T))$,且$\text{shrink}^1(T) = \text{shrink}(T)$。
这里我们解释一下$f[u][i]$的形式定义的意义。这是一个条件概率,是在条件$u \in \text{shrink}^{\text{size}(u)-i-1}(T_u)$下,$u \in \text{shrink}^{\text{size}(u)-1}(T_u)$的概率。由于$|T_u| = \text{size}(u)$,因此$T_u$只会进行$\text{size}(u)-1$次缩小操作,这时$\text{shrink}^{\text{size}(u)-1}(T_u)$只会剩下一个节点,而$u \in \text{shrink}^{\text{size}(u)-1}(T_u)$便是描述最后剩下节点$u$的事件。另一方面,在$T_u$在缩小过程中只剩下恰好$i$条边时,即其恰好进行了$\text{size}(u)-i-1$次缩小操作,因此$u \in \text{shrink}^{\text{size}(u)-i-1}(T_u)$正是描述了$T_u$在这过程中仅剩恰好$i$条边时节点$u$仍然存在的事件。
这个条件概率与最后剩下根节点的概率的关系如下:
$$ \Pr[r \in T_{n-1}] = f[r][n-1]. $$
现在我们考虑如何计算$f[u][i]$,从一个特殊情况入手。
特殊情况:若$u$只有一个子节点$v$
我们引入中间条件【$(u, v)$是否存在】,然后分别计算条件概率。
注:【$(u, v)$是否存在】的意思是$T_u$中$(u, v)$这条边是否存在。特别地,如果在缩小的过程中,节点$u$或者节点$v$被其他节点合并(从而消失)了,但是$(u, v)$这条边依然认为是存在的。缩小过程其实可以看做是节点集的合并过程(类似并查集),如果节点$u$和节点$v$不在一个“并查集”里,则认为$(u, v)$这条边依然存在。换句话说,当节点$u$和节点$v$所在的“并查集”合并的时候,$(u, v)$这条边便认为是不存在了。
为方便,我们简记$\text{shrink}^k(T) = T^k$,以及$\text{size}(u) = |u|$。
$$
\begin{aligned}
f[u][i]
& = \Pr \Big[ u \in T_u^{|u|-1} \Big| u \in T_u^{|u|-i-1} \Big] \\
& = \Pr \Big[ (u, v) \in T_u^{|u|-i-1} \Big| u \in T_u^{|u|-i-1} \Big] \Pr \Big[ u \in T_u^{|u|-1} \Big| u \in T_u^{|u|-i-1} \land (u, v) \in T_u^{|u|-i-1} \Big] + \Pr \Big[ (u, v) \notin T_u^{|u|-i-1} \Big| u \in T_u^{|u|-i-1} \Big] \Pr \Big[ u \in T_u^{|u|-1} \Big| u \in T_u^{|u|-i-1} \land (u, v) \notin T_u^{|u|-i-1} \Big]
\end{aligned}
$$
我们依次计算每个概率。
Part 1
$\Pr \Big[ (u, v) \in T_u^{|u|-i-1} \Big| u \in T_u^{|u|-i-1} \Big]$即为在$T_u$仅剩$i$条边的时候$(u, v)$边仍然存在的概率,即从$|v|$条边中选取$i$条边,并且选中某条给定边的概率,即
$$ \Pr \Big[ (u, v) \in T_u^{|u|-i-1} \Big| u \in T_u^{|u|-i-1} \Big] = \frac i {|v|}, $$
进而
$$ \Pr \Big[ (u, v) \notin T_u^{|u|-i-1} \Big| u \in T_u^{|u|-i-1} \Big] = 1-\frac i {|v|}. $$
Part 2
$\Pr \Big[ u \in T_u^{|u|-1} \Big| u \in T_u^{|u|-i-1} \land (u, v) \in T_u^{|u|-i-1} \Big]$即为$T_u$仅剩$i$条边时节点$u$和边$(u, v)$同时存在的条件下,最后剩下节点$u$的概率。我们枚举何时$(u, v)$被删掉,设删掉$(u, v)$后剩下$0 \leq j < i$条边,要求节点$u$在$(u, v)$被删掉时仍然剩下,这个时候就变成了$f[v][j]$的问题,即仅考虑$T_v$,其仅剩下$j$条边的条件下,最后剩下节点$v$的概率。
注意到:
1. 【删掉$(u, v)$后剩下$0 \leq j < i$条边】的概率为$1/i$。
2. 【节点$u$在$(u, v)$被删掉时仍然剩下】的概率为$1/2$。
因此,
$$ \Pr \Big[ u \in T_u^{|u|-1} \Big| u \in T_u^{|u|-i-1} \land (u, v) \in T_u^{|u|-i-1} \Big] = \sum_{j=0}^{i-1} \frac 1 {2i} f[v][j]. $$
Part 3
$\Pr \Big[ u \in T_u^{|u|-1} \Big| u \in T_u^{|u|-i-1} \land (u, v) \notin T_u^{|u|-i-1} \Big]$即为$T_u$仅剩$i$条边时节点$u$存在,但是$(u, v)$边已经不存在的条件下,最后剩下节点$u$的概率,这个概率即是$f[v][i]$,即
$$ \Pr \Big[ u \in T_u^{|u|-1} \Big| u \in T_u^{|u|-i-1} \land (u, v) \notin T_u^{|u|-i-1} \Big] = f[v][i]. $$
我们把上面的每个概率带入$f[u][i]$的计算式,得到
$$
\begin{aligned}
f[u][i]
& = \frac i {|v|} \sum_{j=0}^{i-1} \frac 1 {2i} f[v][j] + \left( 1 - \frac i {|v|} \right) f[v][i] \\
& = \frac 1 {2|v|} \sum_{j=0}^{i-1} f[v][j] + \left( 1 - \frac i {|v|} \right) f[v][i].
\end{aligned}
$$
这个特殊情况,其实是考虑了节点$v$指向其父节点的边$(v, u)$。对于$u$有多个子节点的情况,可令$g[u][v][i]$表示在以$u$为根的子树$T_u$中,$u$的$v$以外的其他儿子节点的子树均被合并了但$u$还存在且仅剩下$i$条边的条件下,最后剩下节点$u$的概率。形式化地,
$$
\begin{aligned}
g[u][v][i]
& = \Pr \Big[ u \in T_u^{|u|-1} \Big| u \in T_u^{|u|-i-1} \subseteq T_v \cup \{(u, v)\} \Big] \\
& = \frac 1 {2|v|} \sum_{j=0}^{i-1} f[v][j] + \left( 1 - \frac i {|v|} \right) f[v][i].
\end{aligned}
$$
多个子节点的情况
我们先考虑$u$只有两个子节点$x$和$y$。
则在计算$f[u][k]$时,枚举$T_u^{|u|-k-1}$中包含$T_x \cup \{ (u,x) \}$中有$0 \leq i \leq k$条边,则$T_u^{|u|-k-1}$中包含$T_y \cup \{ (u,y) \}$中有$j = k-i$条边;即$T_u^{|u|-k-1}$中包含$T_x$中$i$个节点,$T_u^{|u|-k-1}$中包含$T_y$中有$j = k-i$个节点。
$$
\begin{aligned}
f[u][k]
& = \Pr \Big[ u \in T_u^{|u|-1} \Big| u \in T_u^{|u|-k-1} \Big] \\
& = \sum_{i=0}^k \Pr \Big[ \left| T_u^{|u|-k-1} \cap T_x \right| = i \Big| u \in T_u^{|u|-k-1} \Big] \Pr \Big[ u \in T_u^{|u|-1} \Big| u \in T_u^{|u|-k-1} \land \left| T_u^{|u|-k-1} \cap T_x \right| = i \Big]
\end{aligned}
$$
注意到,$\Pr \Big[ \left| T_u^{|u|-k-1} \cap T_x \right| = i \Big| u \in T_u^{|u|-k-1} \Big]$即为在$|x|+|y|$条边里面选择$k$条边,其中$|x|$条边中恰有$i$条,$|y|$条边中恰有$j = k-i$条的概率,即
$$ \Pr \Big[ \left| T_u^{|u|-k-1} \cap T_x \right| = i \Big| u \in T_u^{|u|-k-1} \Big] = \frac {\binom{|x|}{i} \binom{|y|}{j}} {\binom{|x|+|y|}{k}}. $$
而$\Pr \Big[ u \in T_u^{|u|-1} \Big| u \in T_u^{|u|-k-1} \land \left| T_u^{|u|-k-1} \cap T_x \right| = i \Big]$则要求$u$在最后剩下,这个概率等于 $u$在$x$这部分的“角逐”中胜出 且 $u$在$y$这部分的“角逐”中胜出,而$x$部分胜出和$y$部分胜出是独立的,因此
$$ \Pr \Big[ u \in T_u^{|u|-1} \Big| u \in T_u^{|u|-k-1} \land \left| T_u^{|u|-k-1} \cap T_x \right| = i \Big] = g[u][x][i] g[u][y][j]. $$
注:以上等式并未严格证明,因为证明“独立性”是复杂的。我们可以从方案数的角度来证明。从$T_u$剩下$i$条边时,最后剩下$u$的缩小操作可能的组合有$f[u][i] i! 2^i$种。因此,在$x$部分剩余$i$条边,$y$部分剩余$j$条边时,总方案数为$(i+j)! 2^{i+j}$;而最后剩下$u$的方案数则为 仅考虑$x$部分的方案数$g[u][x][i] i! 2^i$,以及仅考虑$y$部分的方案数$g[u][y][j] j! 2^j$后,再把$x$部分的操作(共$i$步)与$y$部分的操作(共$j$步)排列组合一下,共有$ \binom {i+j}{i} $ 种方式,因此
$$ \Pr \Big[ u \in T_u^{|u|-1} \Big| u \in T_u^{|u|-k-1} \land \left| T_u^{|u|-k-1} \cap T_x \right| = i \Big] = \frac{ \binom{i+j}{i} g[u][x][i] i! 2^i g[u][y][j] j! 2^j }{(i+j)! 2^{i+j}} = g[u][x][i] g[u][y][j]. $$
带入$f[u][k]$的求和式可得
$$ f[u][k] = \sum_{i=0}^k \frac{\binom{|x|}{i} \binom{|y|}{k-i}}{\binom{|x|+|y|}{k}} g[u][x][i] g[u][y][k-i]. $$
由此可推广到$u$有若干个子节点$v_1, v_2, \dots, v_m$的情形,此时有
$$ f[u][k] = \sum_{i_1+i_2+\dots+i_m = k} \frac{\binom{|v_1|}{i_1} \dots \binom{|v_m|}{i_m}}{\binom{|v_1|+|v_2|+\dots+|v_m|}{k}} g[u][v_1][i_1] \dots g[u][v_m][i_m]. $$
可用动态规划求解。令
$$ p[u][m][k] = \sum_{i_1+i_2+\dots+i_m = k} \frac{\binom{|v_1|}{i_1} \dots \binom{|v_m|}{i_m}}{\binom{|v_1|+|v_2|+\dots+|v_m|}{k}} g[u][v_1][i_1] \dots g[u][v_m][i_m]. $$
则$f[u][k] = p[u][m][k]$,且
$$ p[u][m][k] = \sum_{i=0}^k \frac {\binom{|v_1|+\dots+|v_{m-1}|}{i} \binom{|v_m|}{i}} {\binom{|v_1|+\dots+|v_m|}{k}} p[u][m-1][i] g[u][v_m][k-i]. $$
可在$O(|u|^2)$的复杂度内求得$f[u][k]$。
从而求得所有$f[][]$的复杂度是$O(n^2)$,其中$f[r][n-1]$即为最后剩下节点$r$的概率。
对每个节点都要做一次,于是复杂度为$O(n^3)$。
相关题解:
我们的做法较为直观,是直接计算概率,而 Mr_spade 的做法则是先统计方案数,然后再除掉总的方案数而得到概率。
由于总方案数应为$n!2^n$,但是 Mr_spade 却不完全是统计方案数,比较不好理解。完全统计方案数的代码可参见 TLE 。
另外, Mr_spade 题解中估计的时间复杂度$O(n^4)$过高,实际算法的复杂度应是$O(n^3)$。只需注意到
$$ \sum_{x \in V} \left( \text{size}(x) \right)^2 = O(n^2). $$