【发布时间】: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解决。所以在尝试理解算法一段时间后,这是我的新尝试:
- 从提供的二维地图构造一个有向图。我假设每个顶点都将相互连接,单向边指向远离 Start 节点。我假设结果图应该是非循环的?
- 用 1 (?) 初始化每个边的容量,因为我不希望算法多次通过同一路径。
- 在该图上运行 Max Flow 算法(Ford-Fulkerson、Dinic 或 Karp-Edmond),Max flow 是防止 A 到达 B 所需的最小切割。
我走对了吗?
【问题讨论】:
-
运行流的图不需要是非循环的,iirc
-
您的方法很接近,但您实际上需要做一些比这更技术性的事情。记住,并不是你不能在一个单元格的任何一条边之间移动不止一次,而是你甚至不能进入一个单元格两次。确保有一条容量为 1 的边表示完全使用单元格:)
标签: algorithm search path-finding