使用Dijkstra算法找到可以承载最大权重的路径

时间:2011-09-09 01:52:54

标签: javascript algorithm dijkstra

我有一个图表,有X个节点和Y个边缘。加权边缘。重点是从一个节点开始,然后停在另一个节点,即最后一个位置。现在问题来了:

可视化问题。边缘是道路,边缘重量是在道路上行驶的车辆的最大重量限制。我们想驾驶最大的卡车从A到F.我想要从A到F的所有路径的最大允许重量。

我可以使用某种Dijkstra算法来解决这个问题吗?我不确定如何以我可以实现的算法的形式表达这个问题。任何帮助深表感谢。我很困惑,因为Dijkstra的算法只是在最短的路径上查看。

4 个答案:

答案 0 :(得分:7)

如果我理解正确,您希望找到具有最大瓶颈边缘的某些节点之间的路径。也就是说,您希望最小边缘尽可能大的路径。如果这是您想要解决的问题,那么可以使用Dijkstra算法进行非常直接的修改来解决问题。

该算法背后的想法是运行Dijkstra的算法。通常,在运行Dijkstra算法时,您会跟踪到每个节点的最短路径的长度。在修改后的Dijkstra算法中,您可以为每个节点存储到达节点的任何路径上最小权重边的最大可能值。换句话说,通常在Dijkstra算法中,您可以通过找到最大化数量的边来确定要扩展的边缘

  

d(s,u)+ l(u,v)

其中s是起始节点,u是你到目前为止探索过的某个节点,而(u,v)是边缘。在修改后的Dijkstra中,您可以找到最小化边缘

  

min(瓶颈(s,u),l(u,v))

也就是说,您考虑从源节点到您目前所见的任何节点的路径上的瓶颈边缘,并考虑如果您离开该节点并进入其他位置将形成什么瓶颈路径。这是目标节点的最佳瓶颈路径,您可以重复此过程。

Dijkstra算法的这种变体也使用良好的优先级队列在O(m + n log n)时间内运行。有关更多信息,请考虑查看对该算法进行简要讨论的these lecture slides

有趣的是,这是一个众所周知的问题,在很多算法中都被用作子程序。例如,用于求解最大流问题的早期多项式时间算法之一使用该算法作为子例程。有关具体方法的详细信息,请查看these lecture notes

希望这有帮助!如果我误解了你的问题,请告诉我,以便删除/更新这个答案。

答案 1 :(得分:1)

没有Dijkstra,没有流动问题。它更容易:只需使用您最喜欢的图形搜索(BFS或DFS)。

而不是计算&跟踪与到达图表中某个节点相关的成本,只需计算允许使用此路径的最大卡车的“大小”(路径中所有边缘的最小权重)。当多个搜索路径在一个节点中相遇时,会丢弃具有较低“卡车重量限制”的路径。

答案 2 :(得分:0)

这是一种简单有效的方法:

MAX成为图表中的最大边权重。二进制搜索0 <= k <= MAX,这样您只能使用权重为A的边从F>= k。您可以使用breadth first search来查看是否可以这样做(如果重量太小,请不要使用边缘)。

这会产生O((X + Y) log V)算法,其中V是权重的范围。

答案 3 :(得分:0)

Dijkstra算法需要的是最优子结构,以及快速计算具有已知目标值的路径的单边扩展的目标值的方法。这里,最优子结构意味着如果你有一个从顶点x到另一个顶点y的最佳路径,那么从x到倒数第二个顶点的子路径是最优的。

(IVlad,我只能随机获得O(X + Y)。)