为什么我的Dijkstra在Java中用于无向图的算法实现不起作用?

时间:2016-06-27 06:52:37

标签: java algorithm graph dijkstra undirected-graph

我对有向图的实现很好。它是一个“懒惰”版本,因为它使用简单的优先级队列而不是索引的队列。我更改了代码以获得无向图的解决方案,但它不起作用。 dijkstra(int s)是类Graph的方法。 Graph的实施基于邻接列表。整个代码基于Sedgewick的书的解释。

public void dijkstra(int s) {

    marked = new boolean[V];
    distTo = new int[V];
    edgeTo = new Edge[V];

    Comparator<Edge> comparator = new Comparator<Edge>() {

        public int compare(Edge e1, Edge e2) {

            int dist1 = distTo[e1.either()] + e1.weight();
            int dist2 = distTo[e2.either()] + e2.weight();

            if (dist1 < dist2) {
                return -1;
            } else if (dist1 > dist2) {
                return 1;
            } else {
                return  0;
            }
        }
    };

    pq = new PriorityQueue<Edge>(comparator);

    for (int v = 0; v < V; ++v) {
        distTo[v] = Integer.MAX_VALUE;
    }

    distTo[s] = 0;

    relax(s);

    while (!pq.isEmpty()) {

        Edge e = pq.poll();

        int v = e.either();
        int w = e.other(v);

        if (!marked[w]) {
            relax(w);
        }
    }
}

private void relax(int v) {

    marked[v] = true;

    for (Edge e : adj[v]) {

        int w = e.other(v);

        if (distTo[w] > distTo[v] + e.weight()) {

            distTo[w] = distTo[v] + e.weight();
            edgeTo[w] = e;
            pq.add(e);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我解决了。愚蠢的错误。而不是添加边

  

v-&gt; w和w-&gt; v

我添加了边

  

v-&gt; w和w-&gt; w

即。我添加了相同的边缘两次,没有创建反向边缘。