[英]Bellman Ford Algorithm fails to compute shortest path for a directed edge-weighted graph
當我在第四版 《 算法》(Robert Sedgewick和Kevin Wayne)中遇到以下問題時,我最近正在理解最短路徑算法。
假設我們通過在EdgeWeightedDigraph中為EdgeWeightedGraph中的每個Edge創建兩個DirectedEdge對象(每個方向一個),將EdgeWeightedGraph轉換為Directed EdgeWeightedGraph,然后使用Bellman-Ford算法。 解釋為什么這種方法會失敗。
下面是我實現Bellman Ford算法(基於隊列)的代碼片段:
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;
}
}
}
}
我已經在紙上嘗試了許多示例,但無法找到僅通過將一條邊沿相反的方向轉換為兩條邊而生成的有向圖在其中具有新的負循環的情況。 我假設在未加權的無向邊加權圖中沒有預先存在的負周期。
您的算法和代碼沒有問題。它可以在沒有負圓的圖形中給出最短距離。僅通過數組'number [i]'記錄負數'i'即可輕松找到負圓。 隊列。
可以證明,如果將一個點放入隊列中超過| P |(點數)次,則圖形中將存在一個負圓。因此,您可以添加:
number[v]++; if (number[v] > |P|) return -1;
帶有負圓的圖形中最短的距離沒有意義,因此在大多數情況下,您只需要在查找時打印一些內容即可。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.