【问题标题】:Finding shortest path distances from a given node s to ALL the nodes in V in a graph with two negative edges在具有两条负边的图中找到从给定节点 s 到 V 中所有节点的最短路径距离
【发布时间】:2014-03-06 06:13:56
【问题描述】:

我对此有一个后续问题: Finding shortest path distances in a graph containing at most two negative edges

Ranveer 的解决方案看起来不错,但速度不够快,因为我需要 O(|E| + |V|*log|V|) 快速算法。

我猜 Dukeling 的解决方案效果很好。这是有道理的,它的运行时间与 Dijkstra 算法的运行时间相同。

但是,我的目标是找到从给定节点 s 到 V 中所有节点的最短路径距离。 如果我通过将 V 中的所有节点设置为结束顶点 e 来应用 Dukeling 算法,我将需要运行它 |V| - 1 次。则运行时间为 O(|V||E| + |V^2|*log|V|)。

任何帮助将不胜感激!

【问题讨论】:

  • 您只需要运行一次:Dijkstra 会找到从源节点到所有其他顶点的最短路径。

标签: algorithm graph dijkstra shortest-path bellman-ford


【解决方案1】:

Dijkstra 算法以其原始形式查找从源节点到图中所有其他节点的所有最短路径。

对于您的问题,您有(至少)两种选择:

  1. 使用Bellman - Ford。它并不像它的大哦所暗示的那么慢,至少不一定。确保像BF search 一样实现它:使用FIFO queue。这意味着每次更新到它的距离时,您将在队列中插入一个节点,并且仅当它尚未在队列中时。其他优化也是可能的,但这应该已经在实践中为您提供了一种快速算法;

  2. 使用Dijkstra's,但修改与Bellman - Ford 类似:默认Dijkstra 从不将节点两次插入优先级队列。如果您已更新到节点的距离,请确保重新插入节点。这将处理负成本边缘。它本质上使算法更接近上述贝尔曼 - 福特,但使用优先级队列而不是 FIFO 队列。这也将使您更接近所需的复杂性。

【讨论】:

  • 思考了几个小时后,我最终同意了杜克林的解决方案。你觉得杜克林的回答有什么问题吗?
  • @user1885433 - 是的,它过于复杂,未经证实和测试。它似乎还假设一个目标节点,并且您想要全部,这意味着您必须运行它|V| - 1 次或调整它。为什么我建议的解决方案不适合您的问题?
  • 我并不是说您建议的解决方案不适合我的问题。我用谷歌搜索了关于修改 Dijkstra 算法以处理负边缘的信息,这似乎是一个合理的解决方案。我唯一担心的是,在最坏的情况下它需要指数级的时间,这比我想要的要慢。
  • 转到algs4.cs.princeton.edu/44sp。它说,“在 DijkstraSP.java 中实现的版本(它允许一个顶点多次入队)在存在负边权重(但没有负循环)的情况下是正确的,但它的运行时间在最坏的情况下是指数级的。”
  • @|V|ad - 事实证明杜克林的方案完全没有问题……
猜你喜欢
  • 1970-01-01
  • 2022-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多