Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我的Dijkstra';无向图';不行?_Java_Algorithm_Graph_Dijkstra_Undirected Graph - Fatal编程技术网

Java 为什么我的Dijkstra';无向图';不行?

Java 为什么我的Dijkstra';无向图';不行?,java,algorithm,graph,dijkstra,undirected-graph,Java,Algorithm,Graph,Dijkstra,Undirected Graph,我对有向图的实现工作得很好。它是一个“懒惰”版本,因为它使用简单的优先级队列而不是索引队列。我更改了代码以获得无向图的解决方案,但它不起作用dijkstra(ints)是类图的一种方法。Graph的实现基于邻接列表。整个代码基于Sedgewick的书中的解释 public void dijkstra(int s) { marked = new boolean[V]; distTo = new int[V]; edgeTo = new Edge[V]; Comp

我对有向图的实现工作得很好。它是一个“懒惰”版本,因为它使用简单的优先级队列而不是索引队列。我更改了代码以获得无向图的解决方案,但它不起作用
dijkstra(ints)
是类
图的一种方法。
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);
        }
    }
}
public void dijkstra(int s){
标记=新布尔值[V];
distTo=新整数[V];
edgeTo=新边[V];
比较器比较器=新比较器(){
公共整数比较(边e1、边e2){
int dist1=distTo[e1.other()]+e1.weight();
int dist2=distTo[e2.other()]+e2.weight();
如果(dist1dist2){
返回1;
}否则{
返回0;
}
}
};
pq=新优先队列(比较器);
对于(int v=0;v距离[v]+e.重量()){
距离[w]=距离[v]+e.重量();
edgeTo[w]=e;
pq.添加(e);
}
}
}

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

v->w和w->v

我加了边

v->w和w->w


i、 e.我添加了两次相同的边,但没有创建反向边。

“不起作用”?如果你希望人们能够提供帮助,请更具体一些。你能解释一下“它不起作用”是什么意思吗?如果你能试着创造一个新的世界,那就太好了。谢谢。dijkstra算法应该提供最短路径。我的实现提供了一个可能的路径,但不是最短的路径。我建议您首先使用断点在标准IDE中调试代码。跟踪流程将更容易,因此您将知道无法获得正确输出的原因。请显示实现未找到最短路径的具体实例。