【发布时间】:2019-08-13 03:45:20
【问题描述】:
我得到了一个图G 和n 顶点,标记从1 到n (2<=n<=10^5)。每个顶点都有一个与之相关的分数。两个朋友A 和B 玩游戏。 A 以顶点 1 和 B 从 n 开始。在任何步骤中,如果该顶点尚未被占据并且与同一玩家已经占据的任何顶点相邻,则玩家可以移动到该顶点。 A 首先开始。最终分数是您从访问的节点获得的所有分数的总和。得分多的玩家获胜。 A 或 B 中的哪一个赢得了比赛?如果两个玩家得分相同,B 获胜。
我的尝试:
如果G 是一棵树,我可以得到从1 到n 的路径。说是
1 -> a_1 -> a_2 -> ... a_k -> n
A 将占据所有 1、a_1、...a_x(其中 x = ceil(k/2))的“子”节点,B 将占据其余节点。我们可以看看谁得到的更多,并成为赢家。
如果G 是一个图(多于n-1 边),则上述方法将不起作用,因为从给定起点到顶点的路径可能不止一条。所以,我为A 和其他B 创建了一个最大堆。那么:
首先在各自的堆中添加
1s 和ns 相邻顶点的分数。获取最大分数的索引,将其删除。将其相邻顶点的分数添加到各自的堆中。
分数高的获胜。
对吗?不,这是一种贪婪的方法,在很多情况下都会给出错误的答案。这种情况下的最佳策略应该是什么?
示例
假设n = 5。以下顶点是相邻的:
1 5
1 2
3 5
4 5
与每个顶点相关的分数分别为:
10 20 30 40 50
A 初始得分为10 和B 50。A 只能访问2(最终得分=10 + 20)而B 可以访问3 和4(最终得分)分数 = 30 + 40 + 50)。因此B 赢得了比赛。
【问题讨论】:
-
我们可能会遇到这样一种情况,即一名球员有可用动作而另一名球员没有。这种情况下游戏会停止吗?
-
@hilberts_drinking_problem no.在这种情况下,另一个人会继续,直到他有可用的动作
-
问题对我来说不是很清楚。玩家是否在前往每个节点时获得分数(因此将您访问的所有节点的分数相加),还是他们在游戏结束时只有当前节点的分数。另外,如果你通过一个节点,你可以重新访问它吗?而其他玩家根本无法使用它?因为那时你可能想访问分数小的节点来阻止访问大块,然后在其他玩家没有移动等时收集它们。请澄清问题。
-
动态编程方法不起作用?每一步,所有相邻的顶点都在哪里考虑?
-
因为游戏中的组合实在是太多了。假设您有一个节点作为通往许多高分节点的通道,如果您获得了入口,尽管该节点的分数为零,您最终将获胜,因为您可以收集所有保留给您的高分节点。在其他一些情况下,您可能需要变得贪婪,只收集得分最高的节点。在其他一些情况下,您可能有兴趣消除对手的最佳情况行动,或通过包围对手等来诱捕对手。因此,这在很大程度上取决于游戏状态,这是一个“最小最大”问题
标签: algorithm graph graph-algorithm graph-traversal