题目
棋盘上,我们可以把格子黑白染色,
看做一个二分图,
如果存在完美匹配,那么Bob每步都可以沿着一条匹配边走,Alice必须沿着非匹配边走,Bob拥有必胜策略。
如果不存在完美匹配,那么对于所有不一定在最大匹配上的(出发)点,Alice都拥有必胜策略:Bob走一条非匹配边,Alice走一条匹配边,否则,我们从原理上分析一波,
如果Alice赢,一定是Bob一开始走了可能为非匹配边的边,那么Bob被迫走非匹配边,即这个点周围的边都可以是非匹配边,那么这个点就可以是非匹配点,还是先手必胜。
那么如何求出不一定在最大匹配上的点呢?
首先求出任意一个最大匹配。对于所有不在最大匹配上的点,如果其与某个匹配点相邻,那么必然存在一种最大匹配,使得这两个节点配对。事实上,它通过交叉路径的匹配边能够到达的所有节点都不一定在最大匹配上。这个统计可以用DFS实现。总复杂度为
O
(
m
a
x
f
l
o
w
(
n
2
,
n
2
)
+
n
2
)
O(maxflow(n^2,n^2)+n^2)
O(maxflow(n2,n2)+n2)
对于这个题,显然n为奇数时先手败,n为偶数是后手败。
推荐题目:「雅礼集训 2017 Day2」棋盘游戏
LOJ #536. 「LibreOJ Round #6」花札
AC Code:
#include<cstdio>
int main(){
int n;
for(;scanf("%d",&n) && n;){
if(n&1) puts("Bob");
else puts("Alice");
}
}