m-图中的可达性

rip*_*234 8 algorithm graph

假设你有一个带骑士,公主和出口的NxN迷宫.

在此输入图像描述

还有一个邪恶的巫婆正计划阻挡M方块(将它们置于火上).在骑士第一次移动之前,她将把所有这些块都置于火上(他们不会交替转弯).

给定迷宫的地图和M,你能否在O(N ^ 2)中决定骑士是否能够到达公主,然后是出口,因为巫婆可以选择任何一个块(意思是 - 可以巫婆做出可以阻止骑士和公主逃跑的选择)?

dav*_*idg 4

这个问题似乎相当于确定是否存在M + 1从骑士到公主的不同路径以及M + 1从公主到出口的不同路径。M如果从骑士到公主(或公主退出)只有不同的路径,女巫可以从每条路径烧掉一个方块,阻止救援(而且,唉,他们之间永远幸福的浪漫的任何机会))。

例如,您问题中的迷宫有两条从骑士到公主的不同路径,以及从公主到出口的两条不同路径。因此,可以燃烧min(2, 2)以防止逃逸。

可以使用最大网络流算法找到两点之间的不同路径的数量。网格中的每个单元格都是网络中的一个节点;如果两个节点相邻且均为白色,则它们有一条边(容量为 1)连接它们。从一点到另一点的最大网络流量表示它们之间不同路径的数量。

Ford Fulkerson 算法会及时解决网络流量问题O(E * f),其中E是网络中的边数(最多N^2),f是最大网络流量的值。由于最大网络流量最多为 4(骑士的第一步只有四个可能的方向),因此总复杂度变为O(2 * E * 4) = O(N^2),如所要求的。

避免多次使用一个节点

正如其他人指出的那样,上述解决方案可以防止进出节点的边被多次使用;不是节点本身。

我们可以修改流程图以避免节点被多次使用,方法是为每个单元提供四个输入边、一个保护边和四个输出边(每个边的权重为 1),如下所示:

细胞图结构图

一个单元的输出边缘对应于另一个单元的输入。现在,每个单元只能用于一条路径,因为保护边缘的流量只能为 1。接收单元和源单元保持不变。每个单元的边数仍然恒定,算法的复杂性保持不变。