java - Dijkstra算法对无向图的错误实现

标签 java shortest-path dijkstra undirected-graph

我正在尝试使用以下伪代码实现 Dijkstra 算法,以找到无向加权图中从起始顶点到每个其他顶点的最短路径:

Initialize D(v) = 0 and D(u) = ∞ for u != v
Initialize priority queue Q of vertices using D as key.
while Q is not empty do

u = Q.removeMin()
for each vertex z adjacent to u and in Q do

if  D(u) + w((u, z)) < D(z) then

    D(z) = D(u) + w((u, z))

    update z in Q

return D

从这里:http://www.csl.mtu.edu/cs2321/www/newLectures/30_More_Dijkstra.htm

这是它的实现:

public void Dijkstra(int start) {
        int[] D = new int[E.length];
        for (int i = 0; i < E.length; i++) {
            D[i] = Integer.MAX_VALUE;
        }
        D[start] = 0;
        PriorityQueue<Integer> Q = new PriorityQueue<>();
        Q.add(start);
        while (!Q.isEmpty()) {
            Integer u = Q.poll();
            System.out.println(u + " ");
            for (int z = 0; z < E[u].size(); z++) {
                Edge e = E[u].get(z);
                if ((D[u] + e.w) < D[e.v]) {
                    D[e.v] = D[u] + e.w;
                    Q.add(e.v);
                }
            }
        }
        System.out.println(D[E.length - 1]);
    }

该图是使用邻接表实现的,在代码 D(u) 中,u 到 v 的距离,E.length 是邻接表的长度,w 是边的权重。 对于此示例:5 个顶点、6 条边以及边权重为 0 1 20、0 2 20、0 4 40、1 3 50、2 3 30 和 3 4 70 的顶点对。 从 1 开始的输出应该是:1 0 2 3 4,距离 140,但我的实现产生输出:1 3 4,距离 120。 我的问题是为什么我在实现中得到这个答案而不是正确的答案。 如果需要类(class)的其他部分,我会发布它们。 感谢您的阅读和帮助!

最佳答案

我认为您没有寻找所有联系。例如,您有 0 1 条边,因此您应该添加 1 0 条边来设置。

关于java - Dijkstra算法对无向图的错误实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52248129/

相关文章:

java - Eclipse RCP - 将属性添加到项目资源管理器中的现有项目

图形的 Javascript 库(在数学意义上)

c - C 中的邻接矩阵上的 Dijkstra

algorithm - 贝尔曼-福特 vs 迪杰斯特拉 : Under what circumstances is Bellman-Ford better?

java - 线程 "main"java.lang.IndexOutOfBoundsException : Index: 0, 中的异常大小:0

java - 使用 Docker 桥接网络时无法在集成测试中获取 JDBC 连接

java - 为什么Java中哈希表(Hashtable)中的 't'不是大写

python - Dijkstra 的 SPF 算法中两个顶点(节点)实例之间的类型错误

algorithm - 如何在一对节点之间的无向图中找到所有边缘不相交的等价路径?

java - j2ME 最快的 Dijkstra 算法