跳转至

有向图游戏

两个人在一个 DAG 上玩一个游戏,DAG 只有一个出发点。在这个出发点上有一个棋子,两人轮流操作,每次可以将棋子推向其的一个儿子,无法操作的玩家判负。

\(SG\) 函数

每个节点都有唯一对应的一个 \(SG\) 值与之对应。\(SG\) 函数定义如下:

  • 没有出度的节点(判负),\(SG_u=0\)
  • 对于其他节点,\(SG_u=\text{mex}_{v\in to[u]}\{SG_{v}\}\)

由定义我们得到一个重要的性质:

性质:对于任意节点 \(u\),对于每个 \(sg\in[0,SG_u)\cap \Z\)\(u\) 节点至少能直接到达一个节点 \(v\) 满足 \(SG_v=sg\)\(SG\) 值为 \(0\) 的节点只能到达 \(SG\) 非零的节点。

\(SG\) 定理:当且仅当出发点的 \(SG\) 值非零,此游戏是先手必胜的。

证明

考虑数学归纳法。

首先,到达一个 \(SG\) 值更大的节点是无效的。因为对手可以立即返回一个 \(SG\) 值和原先相等的节点。

接着,对于最终的必败状态,\(SG=0\)

当处于一个 \(SG\ne 0\) 的节点时,我们可以走到一个 \(SG=0\) 的子节点,使对手处于一个必败状态;对手所处的 \(SG=0\) 的节点只能走到 \(SG\ne 0\) 的必胜状态的节点,使我方总处于必胜状态。

组合游戏

\(n\) 个有向图游戏,每次玩家可以选择在任意一个 DAG 上移动一步,无法移动的判负。

定理:由 \(n\) 个有向图游戏组成的组合游戏,当且仅当

\[ \bigoplus_{i=1}^{n} SG(begin_i)\ne 0 \]

时,此游戏先手必胜。且此异或和可看作是整个游戏初始状态的 SG 值。

证明类似 Nim 游戏,每个有向图游戏的 \(SG\) 值可以改变为小于它的任何一个值,和 Nim 的规则相同。