[英]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.