博弈论
有向图游戏
Nim 游戏
Nim游戏的定义是,给定\(n\)堆石子,两个玩家去交替的拿石头,每次只能拿某一堆的石头,如果此时有一个玩家无法进行这个游戏了,则游戏结束。为了解决这个问题,比较直接的会先想到一个类似于\(DP\)的思路,考虑当前每个状态,去将其划分为两个状态,这里我们定义为\(P:必败态\)和\(N : 必胜态\),将现在的Nim游戏看作是一个有向图上进行的过程,每个结点就是现在游戏的状态(还剩多少堆,每堆还有多少个),直观的去想,出度为0的点可以直接成为\(P\)状态,然后我们考虑能走到最后状态的结点,是不是一定就是\(N\)了,因为一次操作可以直接让其走到必败,所以我们就可以类似递归的去定义,如果当前结点,他能走到的点有\(P\)状态,则他为\(N\)状态,否则为\(P\)状态。
但这样递归的定义复杂度是爆炸的,然后就有了一个神奇的定理,如果当前所有石子堆数异或和不为\(0\),则是必胜态,否则则为必败态,简单证明,全为\(0\)的时候异或和也同样为\(0\),如果此时不为\(0\),所以他一定是某几个二进制位产生了奇数个\(1\),我一定可以通过去操作某一堆来得到一个答案,把奇数个\(1\)给抵消掉,这样就走到\(0\)了。所以转移就成立了。
SG函数
通过Nim游戏,我们可以引入\(SG\)函数。把Nim游戏一般化,不要去思考什么堆数,现在就是在一个有向图上做游戏,终点结束游戏,定义终点值为\(0\),为必败,我们可以计算每个结点的\(mex\)值,现在也将游戏分为两个状态,一:\(mex = 0\),此时能走到的点不存在必败态,所以必败。反之大于0说明存在一个子结点\(mex = 0\),所以必胜。
现在我们把这个问题进一步复杂化,假设只是有一个无向图,而是好多个无向图,每个图上有一个棋子,表示初始状态,那我们怎么确定是否存在必胜必败关系呢?我们可以对一个有向图先去考虑这个问题,假设一个棋子的\(SG\)值为\(k\),说明 他的能走到的结点里,\(mex\)包括了\(0,1,2,...,k - 1\),这不就是Nim游戏,\(n\)堆石头,每次可以拿走一些,变成比他小的值,所以结论一样,异或和大于\(0\)必胜。
标签:状态,结点,有向图,入门,Nim,必败,博弈论,游戏 From: https://www.cnblogs.com/zwh-zzz/p/17361664.html