使用 BFS/DFS 寻找有向无环图中权重最大的路径

Posted

技术标签:

【中文标题】使用 BFS/DFS 寻找有向无环图中权重最大的路径【英文标题】:Using BFS/DFS To Find Path With Maximum Weight in Directed Acyclic Graph 【发布时间】:2019-09-28 00:05:03 【问题描述】:

您有一辆 2005 年的本田雅阁,油箱中还剩 50 英里(最大重量)。您可以在 50 英里半径范围内访问哪些麦当劳位置(图形节点)?这是我的问题。

如果您有一个加权有向无环图,您如何找到在给定权重限制内可以访问的所有节点?

我知道 Dijkstra 的算法,但除了最小路径问题之外,我似乎找不到任何关于其使用的文档。在我的示例中,没有特别要结束的节点,我们只想在不超过最大权重的情况下尽可能多地走。似乎您应该能够使用 BFS/DFS 来解决这个问题,但是我找不到在具有边权重的图中实现这些的文档(同样,在最小路径问题之外)。

【问题讨论】:

【参考方案1】:

可以使用拓扑排序来找到到顶点 V(在本例中为麦当劳)的最长路径。我们可以从拓扑排序我们的节点开始,因为拓扑排序总是会返回源节点 U,在加权路径的端点 V 之前。然后,由于我们现在可以访问一个数组,其中每个源顶点都在其所有相邻顶点之前,我们可以搜索从顶点 U 开始并以顶点 V 结束的每条路径,并在数组中设置一个值,其索引对应于U 到我们发现的连接 U 到 V 的最大边权重。如果最大距离的总和超过 50 没有到达麦当劳,我们可以回溯并探索从 U 到 V 的第二高权重路径,如果我们用尽每一个从顶点 U 退出的路径。最终我们将到达一个麦当劳,这将是与我们原始源节点的最大距离同时保持总跨越距离小于 50 的麦当劳。

【讨论】:

【参考方案2】:

对于这个问题,您需要从起始节点运行 DFS。从起始节点的每个子节点向下递归,直到总权重超过 50。如果沿着遍历记录遇到麦当劳,则在列表或集合中到达节点。通过这样做,您将获得最有效的算法,因为您不必像该问题的其他答案所建议的那样创建完整的拓扑排序。尽管该算法在技术上仍然在 O(ElogV) 时间内运行,但通过在达到超过 50 的路径距离时在 DFS 上递归,您可以避免在不必要时遍历整个图。

【讨论】:

以上是关于使用 BFS/DFS 寻找有向无环图中权重最大的路径的主要内容,如果未能解决你的问题,请参考以下文章

在有向无环图中找到最低共同祖先的算法?

检查有向无环图中两个顶点之间是不是存在路径 - 查询

有向无环图的判定及拓扑排序

算法:有向无环图的最短路径

在有向无环图中求最长路径

有向无环图中的最小路径覆盖