【问题标题】:Find minimum number of blockage needed to prevent A from reaching B找出阻止 A 到达 B 所需的最小阻塞数
【发布时间】:2020-08-11 14:04:15
【问题描述】:

给你一个代表地图的二维数组,例如:

一个。 X。

。 . . .

X X 。乙

注意:'.'代表可遍历的位置 'X' 代表 不可遍历的位置

问题

找出可以阻止 A 到达 B 的最小阻塞数。

对于上面的例子,答案是 1 从这样的定位:

一个。 X。

。 . %。

X X 。乙

注意:'%'代表插入的阻塞

我的尝试

我尝试使用一个简单的 DFS 来解决这个问题,该 DFS 被抛出到 4 个不同的方向,并且仅在该特定路径通向 B 时才增加总阻塞数。但是,这会在标记已经遍历的路径时产生问题,因为任意标记次优路径可能会阻塞搜索工作其他方向。

关于如何以最佳方式解决此问题的任何指示?或者是否有与上述 Leetcode/Codeforces/etc. 的问题相同的编码问题?

编辑 1: 根据Jacob Steinebronn的回答,这个问题可以用Max Flow Algorithm解决。所以在尝试理解算法一段时间后,这是我的新尝试:

  1. 从提供的二维地图构造一个有向图。我假设每个顶点都将相互连接,单向边指向远离 Start 节点。我假设结果图应该是非循环的?
  2. 用 1 (?) 初始化每个边的容量,因为我不希望算法多次通过同一路径。
  3. 在该图上运行 Max Flow 算法(Ford-Fulkerson、Dinic 或 Karp-Edmond),Max flow 是防止 A 到达 B 所需的最小切割。

我走对了吗?

【问题讨论】:

  • 运行流的图不需要是非循环的,iirc
  • 您的方法很接近,但您实际上需要做一些比这更技术性的事情。记住,并不是你不能在一个单元格的任何一条边之间移动不止一次,而是你甚至不能进入一个单元格两次。确保有一条容量为 1 的边表示完全使用单元格:)

标签: algorithm search path-finding


【解决方案1】:

这个问题是一个典型的Min Cut = Max Flow恒等式例子。让我们分解一下: 这个问题可以概括为:给定一个图,以及一个起点和终点,要切割的边的 Min 数量是多少,这样就没有从起点到终点的路径.这可以通过称为 Max Flow 的算法来解决。因此,要解决这个问题,请构建一个图,其中每个节点都连接到与其相邻的所有非阻塞单元(注意有向或无向边)并运行 Max Flow 以获得您的结果。

【讨论】:

  • 我们切割的是节点,而不是边,所以从明显的图表开始,您需要为每个节点拼接一个小工具。
  • 我的意思是是的,但我希望用户弄清楚如何构建图表,将一些问题留给他们,但不要让他们在发现一个非常困难的算法:)
  • @DavidEisenstat 抱歉,您所说的“在每个节点的小工具中拼接”是什么意思?
  • 如果您了解最大流算法,您会发现您并不想限制连接细胞的平凡图的边缘。相反,您希望限制每个单元格,以便只有一个流可以通过。因此,您希望使图形的所有边都具有非常高的容量(4 是最大可能的答案,因此 cap >=4 的任何边都将是无限的)并且具有 cap 为 1 的扼流边表示单元 本身
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-20
  • 2018-01-09
  • 2020-03-29
相关资源
最近更新 更多