当我在书Algorithms, 4th edition, Robert Sedgewick and Kevin Wayne中遇到下面的问题时,我最近了解了最短路径算法。
假设我们将EdgeWeightedGraph转换为Directed EdgeWeightedGraph,方法是在EdgeWeightedGraph中为每个Edge创建EdgeWeightedDigraph中的两个DirectedEdge对象(每个方向一个),然后使用Bellman-Ford算法。解释为什么这种方法失败了。
下面是我的code实施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;
}
}
}
}
我在纸上尝试了很多例子,但是我无法找到生成的有向图会在其中产生新的负循环的场景,只需将边缘转换为相反方向的两条边。我假设未加权的无向边加权图中没有预先存在的负循环。
答案 0 :(得分:-1)
你的算法&代码没有问题。它可以在没有负圆的图形中给出最短距离。并且很容易通过数组'number [i]'记录找到负i的数字。队列中。强>
可以证明,如果一个点被放入队列中超过| P |(点数)次,则图中有一个负圆。所以你可以添加:
number[v]++;
if (number[v] > |P|)
return -1;
带负圆的图形中的最短距离没有意义。因此,对于大多数情况,您只需要在找到它时打印一些东西。