找到阻止 A 到达 B 所需的最小阻塞数

Find minimum number of blockage needed to prevent A from reaching B

You are given a 2D array representing a map e.g.:

A . X .

. . . .

X X . B

Note: '.' represents traversable positions 'X' represents non-traversable positions

THE QUESTION:

Find the minimum number of blockage you can add to prevent A from reaching B.

For the above example, the answer is 1 from a positioning like this:

A . X .

. . % .

X X . B

Note: '%' represents the inserted blockage

我的尝试:

我试图用一个简单的 DFS 来解决这个问题,该 DFS 被抛向 4 个不同的方向,并且只在该特定路径通向 B 时增加总阻塞数。然而,这会在标记已经遍历的路径时产生问题,因为任意标记次优路径可能会阻塞搜索其他方向的努力。

关于如何最佳解决这个问题的任何指示?或者在Leetcode/Codeforces/etc.?

是否有与上述问题一脉相承的编码问题

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

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

我走的路对吗?

这个问题是恒等式Min Cut = Max Flow的经典例子。让我们分解一下: 这个问题可以概括为:给定一个图,以及起点和终点,要 CutMin 边数是多少,这样就有没有从头到尾的路径。这可以通过称为 Max Flow 的算法来解决。因此,为了解决这个问题,构建一个图表,其中每个节点都连接到与其相邻的所有 non-blocked 单元格(注意定向或 non-directed 边)和 运行 最大流量以获得您的结果。