我正在研究爲Bellman-Ford algorithm
單源最短路徑queue-based
辦法從從書算法Robert Sedgewick and Kevin Wayne - Algorithms, 4th edition
源代碼出現在這個環節http://algs4.cs.princeton.edu/44sp/BellmanFordSP.java。貝爾曼福特隊列爲基礎的方法 - 算法,第4版
我有兩點是一個疑問,另一個是代碼改進建議。
在上面的方法中,以下是用於放鬆到頂點距離的鬆弛方法的代碼。
for (DirectedEdge e : G.adj(v)) { int w = e.to(); if (distTo[w] > distTo[v] + e.weight()) { distTo[w] = distTo[v] + e.weight(); edgeTo[w] = e; if (!onQueue[w]) { queue.enqueue(w); onQueue[w] = true; } } if (cost++ % G.V() == 0){ findNegativeCycle(); } }
在以下條件該方法是找到負循環之前使用。
if (cost++ % G.V() == 0){
findNegativeCycle();
}
以上,他們在圖劃分成本由vertices
號檢查negative cycle
。這可能是因爲 放鬆完成V-1
次,如果放鬆運行Vth
時間,這意味着它有循環,其中V是頂點的數量。
但我認爲在基於隊列的方法中,他們使用除數來定期檢查循環是否已經發生。在上述條件成立之前或之後,循環可能發生在 。如果循環發生在上述條件成立之後,則算法必須等待直到下一次條件爲 才能檢測到循環,則如果(cost++ % G.V() == 0)
爲真,則沒有必要正好發生循環。所以我認爲除數可以是足夠小的數量,以便我們可以在適當的時間間隔後檢查循環。 我是否正確地認爲?
代碼改進建議是
findNegativeCycle()
方法可用於在發生循環時返回true。從而。這個條件 -if (cost++ % G.V() == 0) { findNegativeCycle(); }
能TO-
if (cost++ % G.V() == 0)
if(findNegativeCycle()){
return;
}
改變在代碼迴路不斷即使findNegativeCycle()
方法找到了一個週期運行。因此,如果發生循環而不是處理for循環的其餘部分,我們可以返回。
請分享您的想法以上2點。 在此先感謝。
非常感謝您清除這些疑惑。 – anujprashar
@anujprashar不客氣。跟上好的問題,這是一個非常深入的實施這種算法的潛水。 –