我在编程竞赛(Andrew Stankevich Contest 21)中遇到类似游戏的问题时,我已经挣扎了一段时间:
尼克和彼得喜欢玩以下游戏[...]。他们 在一张纸上绘制一个无向二分图G,并将一个标记放在其顶点之一上。之后他们轮流行动。尼克先行动。
移动包括沿图形边缘移动令牌。之后是令牌所在的顶点 在移动之前,以及与其相关的所有边缘,将从图形中移除。拥有的玩家 没有有效的动作会失去游戏。
给出了图表,现在的任务是找到给定的起始节点,如果两个玩家都以最佳方式玩,则起始玩家是赢还是输。总结
由于图表是二分图,Nick(第一个玩家)将始终从左侧移除一个节点,Peter将始终从右侧移除一个节点。
图表最多可以有1000个节点(每边最多500个)和50000个边缘,因此需要一个很好的多项式时间算法(这里的时间限制是2秒来解决所有起始位置,但我认为我们可以在不同的起始位置之间分享大量信息。
我非常确定这可以减少到某种顶点覆盖或打包问题,因为图表是二分的,但我找不到与其中任何一个相关的策略。
我知道特殊情况的解决方案:让我们说方面有 n 1 和 n 2 顶点。如果matching的大小 min(n 1 ,n 2 ),如果较小的一方的玩家开始,比存在一个获胜策略:他必须遵循匹配的边缘并自动获胜。
有什么想法吗?
答案 0 :(得分:9)
命题。 Nick(第一个玩家)从顶点v
开始获胜,如果此顶点属于给定图形的每个可能的最大匹配。我们将分两步证明这一点。
如果没有v
存在最大匹配,则Nick会失败
实际上,由于匹配是最大的,因此没有来自v
的扩充路径。这意味着来自v
的每个简单的奇数路径都可以通过匹配的边缘延长。就我们的问题而言,这意味着每次尼克的行动后,彼得都可以继续比赛。
如果没有v
没有最大匹配,Nick就会胜出
考虑任何可能的最大匹配。沿着此匹配的边缘从v
移动到,例如u
。现在,初始匹配减去边u-v
是剩余图的最大匹配,不包括u
。正如我们从第1步所知,现在移动的玩家(这是彼得)是亏本的。
对于实现,我们可以首先使用简单的算法(see here构建一个示例实现)在O(VE)中构建最大匹配 - 结果通用名称是Kuhn的扩充路径算法。
之后,保持最大匹配并查看每个顶点。如果顶点(比如说v
)当前不在匹配中,那么Nick就输了。如果是,则从匹配中删除相应的边缘,例如v-u
,暂时禁止顶点v
,并在O(E)中搜索来自u
的扩充路径。如果你没有找到这样的路径,尼克会赢,你必须恢复你删除的边缘。否则,尼克再次失败,新的最大匹配可以保持不变。总运行时间再次为O(VE)。
答案 1 :(得分:4)
可爱的问题。我相信预期的解决方案是计算最大匹配,然后确定哪些左顶点属于每个最大匹配。这是第一名球员的胜利。
获胜策略是选择属于最大匹配的边。如果起始顶点v属于每个最大匹配,则由玩家1选择的边e的另一个端点w不属于图的每个最大匹配减去v(因为v属于每个最大匹配,最大基数)删除后匹配减少一个,所以由于e属于某个最大匹配M,我们在新图中M-e最大,并且e的另一个端点不匹配)。相反,如果存在v不属于的最大匹配,则其所有邻居w都属于图的所有最大匹配减去v(否则,找到没有w的最大匹配并且将边从v添加到w,相矛盾当我们删除v)时,假设匹配的最大基数没有减少。