我一直在为一个编程竞赛(Andrew Stankevich Contest 21)中的一个问题苦苦挣扎,这个游戏如下所示:
尼克和彼得喜欢玩以下游戏 [...]。他们在一张纸上绘制一个无向二分图 G,并在其中一个顶点上放置一个标记。之后,他们轮流行动。尼克先行动。
移动包括沿图边缘移动标记。在它之后,标记在移动之前所在的顶点以及与其相关的所有边都从图中删除。没有有效动作的玩家输掉游戏。
给出了图表,现在的任务是寻找给定的起始节点,如果两个玩家都发挥最佳,起始玩家是赢还是输。总结
- 二分图
- 我们得到了起始节点(比如在左侧)
- 我们轮流移动,移动包括跟随一条边,但我们不能访问已经访问过的节点
- 不能移动的玩家输了
由于该图是二分图,Nick(第一个玩家)总是会从左侧删除一个节点,而 Peter 总是会从右侧删除一个节点。
该图最多可以有1000个节点(每边最多500个)和50000条边,所以需要一个好的多项式时间算法(这里的时间限制是2秒来解决所有起始位置,但我认为我们可以分享很多不同起始位置之间的信息)。
我很确定这可以简化为某种顶点覆盖或打包问题,因为该图是二分图,但我找不到与其中任何一个相关的策略。
我知道一个特殊情况的解决方案:假设边分别有n 1和n 2个顶点。如果存在大小为min(n 1 , n 2 )的匹配并且如果较小一方的玩家开始,则存在获胜策略:他只需遵循匹配的边缘并自动获胜。
有任何想法吗?