修正后的骑士旅行问题的最大流量解决方案

时间:2018-10-15 23:28:07

标签: algorithm graph big-o ford-fulkerson

您将得到一个n x n棋盘,上面有k个骑士(相同颜色)。有人将强力胶洒在了正方形的k个上,如果骑士在其中一个正方形上完成移动,它将永远卡住。另外(这就是为什么我们不能拥有美好的事物的原因),有人切出了一些正方形,因此棋盘上有孔。您将获得骑士的初始职位。骑士的动作与常规象棋一样,但是与常规象棋不同,所有骑士每回合都会一次移动(当然,被卡住的骑士除外)。每步结束时,一个方格不能超过1个骑士。孔正方形也不能被骑士占据(但它们确实算作骑士可以跳过的正方形)。给出一个0(t x poly(n))时间算法,以确定是否可以使用

我最初的想法是将这个问题公式化为最大流量问题,并使用Ford-Fulkerson算法解决它。但是我不确定节点和边缘应该是什么。任何想法?谢谢!

1 个答案:

答案 0 :(得分:4)

可以将描述的问题建模为分层网络问题,如下所示。网络的节点集由人工起始节点s和人工终端节点t组成。中间节点集由k个棋盘的n * n个副本组成,这意味着有

2 + k * n * n
总共

个节点。想象一下s在顶部,然后是棋盘副本的k层。终端节点t将在底部。

s连接到第一个棋盘上的初始骑士位置,并将t连接到第k个棋盘上的骑士的所有所需终端位置。

对于每一个i in {1,...,k-1},将第i号棋盘中的每个方块连接到i+1棋盘中的每个方块,只要且仅当通过合法骑士的举动才能达到时即可。最后,删除所有留下超粘正方形的边缘(除非t是其尾巴),并删除所有导致孔洞的边缘。此外,每个边都受限制以允许至少0且最多1的流量。总的来说,该网络最多拥有

2 * k + k * n * n = k * ( 2 + n * n )

边缘。为了进一步考虑到每个方格最多被一个骑士占据,每个中间节点中的流量也必须受到1的约束。这可以通过以下方式完成:将每个中间节点扩展为两个节点,并通过附加边连接它们,该附加边的流动受1约束,这导致节点和边的集合最多增长{{ 1}}。

当且仅当网络允许值2的{​​{1}}-k-流时,s名骑士才能从其初始位置移动到终点位置,骑士运动的顺序和实现网络的流动是双向的。