二分图博弈学习笔记
二分图博弈
二分图博弈是少有的直接跟图论挂钩的一种博弈模型
一个博弈是二分图博弈应当满足一下条件:
- 博弈人数为两人,轮流操作
- 博弈状态转移可以表示成一张二分图
- 不可访问已经访问过的状态
- 无法转移者负
拥有二分图这么良好的性质,该博弈模型自然而然的有一个很简单的结论:如果先手状态,我们记为P,一定在二分图的最大匹配中,那么先手必胜。否则先手必败。
那么我们来看看证明:
假设当前P不在最大匹配中,那么先手移动之后P一定会到达一个匹配点,否则我们就有了一个新的匹配,与最大匹配这一点矛盾。所以此时我们的局面是当前处于匹配点上,后手先行动。后手走的下一个点也一定是匹配点,否则就跟之前的路径形成了一条增广路,同样矛盾。所以接下来双方都是在匹配点上转移。显然最终移动步数为偶数,故此时后手必胜。
若P在最大匹配中,则只要仿照上述策略,就是一个必胜的局面。
如果P没有可以转移的局面,同样也是不在最大匹配中,当然也是必败。
由此,对于一个二分图博弈,只要我们能够判断先手所在局面是否处在二分图的最大匹配上,即可判断必胜状态。
如何判断一个点是否一定在最大匹配上?比较经典的套路就是先将其从图中移除,然后再加进来,看看是否还能对匹配有贡献。如果有的话,说明其一定处在最大匹配上。
具体实现,我们可以采用网络流。在建图的时候先不将P与源点或者汇点连接,这样跑网络流的时候就不会将其考虑进去。然后把P与源点/汇点连接,利用残量网络,再做一遍网络流。如果值非0,就是有贡献的。
但是该方法仅适用于单起点博弈 。如果需要判断的局面过多,显然时间复杂度无法接受。
如果想要找出所有局面中的必胜局面,我们有更好的办法。
找出所有必胜局面,也就是找出所有一定处在最大匹配的点,相当于找出所有不一定在最大匹配上的点。
编辑
非匹配边1->5和2->5匹配边可以互换最大匹配数不变,所以点1,2都不一定在最大匹配中。在该图的残量网络中,1->5的流量为1,匹配边5->2的反向流量为1,因此我们判断两条边可以互换。将与源点相连的边颜色col设为1,汇点设为0,dfs即可。这是判断与左部点的,判断右部点同理。
但是,但是,并不是所有满足二分图博弈模型的题目都一定得通过网络流来求解,因为不同博弈模型本身有其独特的性质,可能可以通过其他途径求解,比如*23牛客多校2 I Link with Gomoku*
然后就到了喜闻乐见的例题时间
[COCI2017-2018#5] Planinarenje
大意:
模板题
不难发现,判负的条件与一方无法行动是等价的,所以该问题完美符合二分图博弈模型。然后又因为要对所有先手局面判断是否必胜,那么我们应该采用第二种方法。
code
1 |
|
大意: 有m个数位的数字锁,存在若干状态不允许访问,也不允许访问之前访问过的节点,每次操作改变某一位,无法操作者负。给定锁的初始状态,问必胜状态。
思路: 显然锁的状态是一张二分图,因为数位和奇偶性相同的状态显然无法一次到达。那么我们只要把非法的状态不加入图中,然后采用第一种判断方法就可以了。
code
1 |
|
大意:
n行m列的棋盘,每一格有一个黑/白棋,还有一个位置是空的
每一局游戏总是兔兔先操作,之后双方轮流操作,具体操作为:
- 兔兔每次操作时,选择一枚与空格相邻的白色棋子,将它移进空格。
- 蛋蛋每次操作时,选择一枚与空格相邻的黑色棋子,将它移进空格。
第一个不能按照规则操作的人输掉游戏。
思路: 有幸做出人生第二道黑题(敲下来有阻塞,但没想象中那么费劲)
我们稍微转化一下,将黑白棋的移动看成空格的移动。先手操作的时候,空格只能与白棋交换,此空格相当于黑棋。后手操作的时候,空格只能与黑棋交换,此时空格相当于白棋。所以相当于轮流在黑白棋之间切换,每次只能与不同颜色的点交换位置,显然是一张二分图。此外有一个性质比较隐蔽,那就是我们无法访问之前访问过的局面。因为黑白棋是轮流操作的,黑棋走过的点白棋是无法走的,反之同理。由此,我们成功转化成了二分图博弈,
这题要求我们输出所有操作失误的步骤。其实就是操作前后的都处于必胜状态的点。(仔细想想,不难理解)。每次操作之后整张图都不一样了,我们要判断的起始点也不一样了,所以我们每次要重新建图,因为图比较小,所以该方法是可行的。
code
1 |
|