一类可以转化成有向图上博弈的问题
_jimmywang_ · · 算法·理论
概述
定义基本规则:
-
两个玩家轮流移动同一颗棋子(棋子就是当前状态,边就是状态的转移)。
-
每次移动沿一条出边将棋子移到下一个点。
-
当前玩家走不了(没有出边)时输。
-
图可能有环,游戏无法结束时为平局。
出现平局的根本原因是决策会绕起来成环。我们先来解决如何判断一个点的胜负状态。
首先,如果图是 DAG,则有经典做法:
-
没有出边的点先手必败。
-
出边中能走到先手必败点的点先手必胜。
-
所有出边走到的都是先手必胜点的点先手必败。
然后有了环,先给出结论:只需加上这一条即可:
- 建反图,由已知状态倒推,不满足上述任意一种情况的点即为平局。
考虑证明。将不满足前三种情况的点称为“状态未知”。
若当前在一个状态未知的点,它一定不满足前三种情况。于是这个点必然满足:出边到达的点中有一些先手必胜,另外的状态未知且存在至少一个这样的点。
这样,当前玩家为了不败,一定不会走那些先手必胜的点,而走向状态未知的点。如此下来,棋子所在的位置永远是状态未知的点,因此游戏不会结束,即为平局。
具体做法是建反图然后 bfs,然后根据当前点的状态与上述规则进行转移。
例题
-
1. [ABC209E] Shiritori
一个单词可看作是一条边,代表前三个字母的状态走向后三个字母的状态。
比如 abcdef
就是 abc
走向 def
。
直接运用上述做法,转化成起点是起始单词的后三个字母,Aoki
先手的游戏。
code
-
2. [ABC261Ex] Game on Graph
略微修改一下“胜负”的定义,改为“游戏是否会结束”。
定义 Takahashi
/Aoki
在
对于
-
若
\forall u \to v,end_{v,0}= \text{Ture} ,则end_{u,1}=\text{Ture} 。 -
若
\exist u \to v,end_{v,1}= \text{Ture} ,则end_{u,0}=\text{Ture} 。
其余情况均为
然后是求以每个点开始游戏时结束后的值 Takahashi
/Aoki
在
则有:
而在用上面方法的时候,
而转移顺序对
code
-
3. P9169 [省选联考 2023] 过河卒
胜负状态与平局都很明确,直接做就行了。
状态有
具体地,
与上文一样,而此题边权都是 1,相当于保证了直接用 queue 的正确性(先转移步数少的)。可以与上一题类比成边权为 1 和边权大于 1 的最短路。
轻微卡常,可以把红棋有序变无序,状态数压一半。
code
-
4. P6970 [NEERC 2016] Game on Graph
注:引自我的另一篇文章。
这个题和普通的有向图上博弈不同,加了一个某一方优先选择平局的条件,因此看起来很奇怪。
因为双方目标不同,首先可以想到把每个点拆成
为了简化问题,我们先把问题转化为一方不想游戏结束,另一方想要游戏结束。这和 [ABC261Ex] Game on Graph 的第一步相似。我们定义
-
如果存在
(u,v)\in E 使得End_{v,0}=1 ,那么End_{u,1}=1 。反之End_{u,1}=0 。 -
如果对于所有
(u,v)\in E 都有End_{v,1}=1 ,那么End_{u,0}=1 。反之End_{u,0}=0 。
简单地说,如果