树上博弈
树上博弈
前置知识
基础图论知识,SG定理
问题描述
设\(T\)为一个森林,其中有\(n\)颗有根树,且树根都在地面上。\(Alice、Bob\)每次选择某一棵树的一条边,删除这条边以及这条边所连接的地上部分,最后无法操作的人输掉博弈。
简化问题
引入“竹子”的概念,如果一棵树退化成链,那么我们称其为一根竹子。
若是由竹子形成的森林(竹林),那么显然这个游戏就等价于一个Nim游戏,对于每棵树有\(SG(x)\)为这棵竹子的边数,于是我们所求解的问题就是这样\(n\)颗竹子所形成的组合游戏,根据\(SG\)定理求解即可。
那么我们想是的一棵树能够等价于一颗竹子的形状(已经变成竹子的形状了)
Colon Principle(克朗原理)
首先,我们约定对任意一个节点的\(SG\)值是以这个点为根张成的子树的\(SG\)值,对于某一个点\(x\),设其子节点为\(x_1,x_2,x_3, \dots, x_t\)
那么由\(Colon Principle\),我们有
\[SG(x)= \begin{cases} 0 & t=0 \\ (SG(x_1)+1) \oplus (SG(x_2)+1) \oplus \dots \oplus (SG(x_n)+1) & t>0\end{cases} \]通俗的解释来说,一棵树等价于一颗长度为其所有子树的“长度”+1的异或值的竹子。这里子树的“长度”可以通过递归的方法求得。(一点也不通俗好吗!)
证明(口胡):
首先,若一颗树只有根节点,那么显然其\(SG\)值为\(0\)。
而若这棵树有多个节点,对于其根节点\(x\),考虑其子节点\(x_1,\dots,x_t\)所构成的子树。
那么显然此时游戏相当于有\(t\)颗由根节点\(x\)加上其一颗子树\(x_i\)所构成的组合游戏,于是我们需要证明对于这样的一种加了一条边的子树,其\(SG\)值为不加这一条边之前的\(SG\)值加一。
若由\(x_i\)构成的子树并不是一条链,那么我们则考虑以\(x_i\)为根的子树,把子树等价于不含分叉的链后进行操作。于是我们得到\(t\)条链,设第\(i\)条链的长度为\(a_i\),那么其\(SG\)值为\(a_i\),而加上一条边之后,这条链的长度变为\(a_i+1\),相应的\(SG\)值也变为\(a_i+1\)。
于是在子节点构成的子树全部为链时我们能把一颗子树等价于一条链,重复这样的操作,就可以将整颗树等价于一条链。于是证毕。
结合图来解释一波:
我们想要把\(1\)号树等价成一颗竹子,然后发现\(3\)号和\(5\)号子树还不是竹子
于是我们需要先把\(3\)号和\(5\)号等价成竹子再对\(1\)号进行等价
于是考虑\(3\)号子树
对于\(3\)号子树来说,其所有子节点都已经是竹子(而不是树)的根,于是其等价于这样几个竹子的组合游戏,从而\(SG(3) = (SG(6)+1) \oplus (SG(7)+1) \oplus (SG(8)+1)\)
于是自然的,我们最后能得到整颗树的\(SG\)值
对于博弈的大部分问题,只要SG值相同,就可以互相转化