我曾经在一个编程竞赛中(Andrew Stankevich Contest 21)遇到了一个问题,涉及以下游戏:
Nick和Peter喜欢玩以下游戏[...]。他们在一张纸上画出一个无向二分图G,并将代币放置在其中一个顶点上。之后,他们轮流移动代币。
一次移动包括沿着图边移动代币。移动后,代币所在的顶点以及与其相邻的所有边都将从图中删除。不能进行有效移动的玩家输掉游戏。
给定图形,现在的任务是为给定的起始节点找出开始玩家是否会在双方都采取最佳策略的情况下获胜或失败。总结如下:
- 二分图
- 我们给出起始节点(例如在左侧)
- 我们轮流移动,每次移动包括沿着边缘移动,但不能访问已经访问过的节点
- 不能移动的玩家输掉游戏
该图最多可以有1000个节点(每个侧面最多500个),50000条边,因此需要一个良好的多项式时间算法(时间限制为2秒以解决所有起始位置,但我认为我们可以在不同的起始位置之间共享很多信息)。
我相当确定这可以简化为某种顶点覆盖或打包问题,因为图是二分图,但我找不到与任何这些相关的策略。
我知道特殊情况的解决方案:假设两侧分别有n1和n2个顶点。如果存在大小为min(n1,n2)的matching,并且如果较小侧面的玩家开始,则存在获胜策略:他只需跟随匹配的边缘并自动获胜。
有什么想法吗?