• CodeForces 1060F. Shrinking Tree


    题目简述:给定一棵$nleq 50$个节点的树。树的缩小过程则是重复以下操作直到仅剩下一个节点为止:

      等概率随机选择一条边$(u, v)$,然后将节点$u$和节点$v$合并成一个新的节点$w$,所有与节点$u$或节点$v$相连的边都改为与节点$w$相连,并且以相同的概率将新的节点$w$仍然标记为节点$u$或节点$v$。

    对每个$i$,求最后剩下节点$i$的概率。

    解:code

    建模:

    设树为$T = (V, E)$,一次缩小操作后树变为$T' = (V', E')$,记作$T' = ext{shrink}(T)$。对$i geq 1$,令$T_i = ext{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 ext{shrink}^{ ext{size}(u)-1}(T_u) | u in ext{shrink}^{ ext{size}(u)-i-1}(T_u) ]. $$

    其中$ ext{shrink}^{k}(T)$表示$ ext{shrink}$作用在$T$上$k$次,即$ ext{shrink}^{k}(T) = ext{shrink}( ext{shrink}^{k-1}(T))$,且$ ext{shrink}^1(T) = ext{shrink}(T)$。

    这里我们解释一下$f[u][i]$的形式定义的意义。这是一个条件概率,是在条件$u in ext{shrink}^{ ext{size}(u)-i-1}(T_u)$下,$u in ext{shrink}^{ ext{size}(u)-1}(T_u)$的概率。由于$|T_u| = ext{size}(u)$,因此$T_u$只会进行$ ext{size}(u)-1$次缩小操作,这时$ ext{shrink}^{ ext{size}(u)-1}(T_u)$只会剩下一个节点,而$u in ext{shrink}^{ ext{size}(u)-1}(T_u)$便是描述最后剩下节点$u$的事件。另一方面,在$T_u$在缩小过程中只剩下恰好$i$条边时,即其恰好进行了$ ext{size}(u)-i-1$次缩小操作,因此$u in ext{shrink}^{ ext{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)$这条边便认为是不存在了。

    为方便,我们简记$ ext{shrink}^k(T) = T^k$,以及$ ext{size}(u) = |u|$。

    $$
    egin{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) otin 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) otin 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) otin 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) otin 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) otin T_u^{|u|-i-1} Big] = f[v][i]. $$

    我们把上面的每个概率带入$f[u][i]$的计算式,得到

    $$
    egin{aligned}
    f[u][i]
    & = frac i {|v|} sum_{j=0}^{i-1} frac 1 {2i} f[v][j] + left( 1 - frac i {|v|} ight) f[v][i] \
    & = frac 1 {2|v|} sum_{j=0}^{i-1} f[v][j] + left( 1 - frac i {|v|} ight) f[v][i]. 
    end{aligned}
    $$

    这个特殊情况,其实是考虑了节点$v$指向其父节点的边$(v, u)$。对于$u$有多个子节点的情况,可令$g[u][v][i]$表示在以$u$为根的子树$T_u$中,$u$的$v$以外的其他儿子节点的子树均被合并了但$u$还存在且仅剩下$i$条边的条件下,最后剩下节点$u$的概率。形式化地,

    $$
    egin{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|} ight) 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$个节点。

    $$
    egin{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 ight| = 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 ight| = i Big]
    end{aligned}
    $$

    注意到,$Pr Big[ left| T_u^{|u|-k-1} cap T_x ight| = 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 ight| = i Big| u in T_u^{|u|-k-1} Big] = frac {inom{|x|}{i} inom{|y|}{j}} {inom{|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 ight| = 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 ight| = 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$步)排列组合一下,共有$ inom {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 ight| = i Big] = frac{ inom{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{inom{|x|}{i} inom{|y|}{k-i}}{inom{|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{inom{|v_1|}{i_1} dots inom{|v_m|}{i_m}}{inom{|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{inom{|v_1|}{i_1} dots inom{|v_m|}{i_m}}{inom{|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 {inom{|v_1|+dots+|v_{m-1}|}{i} inom{|v_m|}{i}} {inom{|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( ext{size}(x) ight)^2 = O(n^2). $$

  • 相关阅读:
    你的人生许多痛苦源于盲目较劲
    这些HTML、CSS知识点,面试和平时开发都需要 (转)
    拿什么拯救你,我的代码--c#编码规范实战篇 (转)
    最近的面试总结
    感恩和珍惜现在的生活
    我眼中的领域驱动设计(转)
    《生活就像练习》读书笔记(四)——意识状态和类型
    《生活就像练习》读书笔记(三)——发展路线
    .NET面试题解析(07)-多线程编程与线程同步 (转)
    C#进阶系列——WebApi身份认证解决方案:Basic基础认证 (转)
  • 原文地址:https://www.cnblogs.com/TinyWong/p/10416103.html
Copyright © 2020-2023  润新知