设计时间为O(k(| V | + | E |))的单源最短路径问题的算法

时间:2019-03-12 10:18:27

标签: algorithm graph graph-algorithm directed-graph

假设我们得到的有向图G = (V, E)的边长可能为正和负,但没有负循环。假设s ∈ V为给定来源 顶点。如果从s到任何其他顶点的最短路径最多花费O(k(|V | + |E|)),如何设计在时间k edges上运行的单源最短路径问题的算法?

1 个答案:

答案 0 :(得分:1)

这里的O(k(| V | + | E |))方法:

  1. 我们可以对Bellman-Ford算法进行一些修改
  2. 创建数组D []以存储从节点s到某个节点u的最短路径
  3. 最初D [s] = 0,所有其他D [i] = + oo(无穷大)
  4. 现在我们遍历所有边缘k次并放松它们之后,D [u]会在<= k条边缘之后保持从节点s到u的最短路径值
  5. 因为任何s-u最短路径最多为k条边,所以我们可以在k条边上进行k次迭代后结束算法

    伪代码:

      

    对于顶点中的每个顶点v:
         D [v]:= + oo

         

    D [s] = 0

         

    重复k次:
      对于每个边(u,v),边上的权重为w:
             如果D [u] + w             D [v] = D [u] + w