您将得到一个n x n棋盘,上面有k个骑士(相同颜色)。有人将强力胶洒在了正方形的k个上,如果骑士在其中一个正方形上完成移动,它将永远卡住。另外(这就是为什么我们不能拥有美好的事物的原因),有人切出了一些正方形,因此棋盘上有孔。您将获得骑士的初始职位。骑士的动作与常规象棋一样,但是与常规象棋不同,所有骑士每回合都会一次移动(当然,被卡住的骑士除外)。每步结束时,一个方格不能超过1个骑士。孔正方形也不能被骑士占据(但它们确实算作骑士可以跳过的正方形)。给出一个0(t x poly(n))时间算法,以确定是否可以使用 我最初的想法是将这个问题公式化为最大流量问题,并使用Ford-Fulkerson算法解决它。但是我不确定节点和边缘应该是什么。任何想法?谢谢!
答案 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
名骑士才能从其初始位置移动到终点位置,骑士运动的顺序和实现网络的流动是双向的。