2015-02-11 66 views
0

我知道Bellman-Ford算法最多需要| V | - 如果圖形不包含負重量循環,則重複1次以找到最短路徑。有沒有辦法修改Bellman-Ford算法,以便在1次迭代中找到最短路徑?Bellman-Ford算法

+3

否,否則將會是算法 – amit 2015-02-11 18:06:41

+2

請確保| V | <= 2? – twalberg 2015-02-11 18:52:23

+0

不,具有不同節點的簡單圖中最長的路徑可以具有最大的V-1邊,因此V-1迭代,請參閱維基上的證明,您將瞭解 – sashas 2015-02-11 20:08:16

回答

0

不,Bellman-Ford的最壞情況運行時間是O(E * V),這是因爲需要在V-1次上遍歷圖。但是,通過使用基於隊列的貝爾曼變換,我們可以實際上改進Bellman-Ford的運行時間O(E + V)。

這裏是基於隊列的Bellman-Ford實現。從booksite Algorithms, 4th edition, Robert Sedgewick and Kevin Wayne

private void findShortestPath(int src) { 
    queue.add(src); 
    distTo[src] = 0; 
    edgeTo[src] = -1; 
    while (!queue.isEmpty()) { 
     int v = queue.poll(); 
     onQueue[v] = false; 
     for (Edge e : adj(v)){ 
      int w = e.dest; 
      if (distTo[w] > distTo[v] + e.weight) { 
       distTo[w] = distTo[v] + e.weight; 
       edgeTo[w] = v; 
      } 
      if (!onQueue[w]) { 
       onQueue[w] = true; 
       queue.add(w); 
      } 

      //Find if a negative cycle exists after every V passes 
      if (cost++ % V == 0) { 
       if (findNegativeCycle()) 
        return; 
      } 
     } 
    } 
} 

在最壞的情況下運行該算法的時間啓發代碼仍然是O(E * V),但在這種算法通常運行在O(E + V)實際。