设计单源最短路径问题的算法

时间:2019-03-12 14:09:47

标签: algorithm graph tree directed-graph

假设有向图G =(V,E),其边长可能为正和负,但没有负循环。设s∈V为给定的源顶点。如何针对在其中运行的单源最短路径问题设计算法 时间O k(| V | + | E |),如果从s到任何其他顶点的最短路径最多包含k条边,而我们不知道k是什么。

1 个答案:

答案 0 :(得分:0)

这里的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. 因此,如果在某些迭代中我们不能放松任何边缘,则意味着我们已经达到迭代k + 1,并且由于最短路径无法改善,因此可以终止算法

    伪代码:

       for each vertex v in vertices:  
           D[v] := +oo  
    
     D[s] = 0  
     lastRelaxation = 0  
        for i in [1,n]:  
        {  
         for each edge (u, v) with weight w in edges:  
               if D[u] + w < D[v]:  
                  {   
                  D[v] = D[u] + w  
                  lastRelaxation = i  
                  }  
         if lastRelaxation != i) break;
        }