Java 无向图的Dijkstra最短路径

Java 无向图的Dijkstra最短路径,java,graph,dijkstra,shortest-path,Java,Graph,Dijkstra,Shortest Path,我下面的代码对于有向图来说工作得非常好,当给定一个无向图时,它不会返回最短路径 public void Djikstra(int s){ boolean[] marked = new boolean[V]; dist = new double[V]; for(int i = 0; i<V; i++){ # initializing array dist[i] = Double.POSITIVE_INFINITY; } dist[s]

我下面的代码对于有向图来说工作得非常好,当给定一个无向图时,它不会返回最短路径

public void Djikstra(int s){
    boolean[] marked = new boolean[V];
    dist = new double[V];

    for(int i = 0; i<V; i++){ # initializing array
        dist[i] = Double.POSITIVE_INFINITY;
    }
    dist[s] = 0.0;

    Queue<Integer> pqs = new PriorityQueue<Integer>();

    pqs.add(s);
    while(!pqs.isEmpty()){
        int v = pqs.poll();

        if(marked[v]) continue;
        marked[v] = true;

        for(Edge e : get_list(v)){ # get_list(v) will return an iterable from the adjacency list at index v 
            v = e.getV()
            int w = e.getW();
            if(dist[w] > dist[v] + e.getWeight()){
                dist[w] = dist[v] + e.getWeight();
                distances[w] = e #all the distances will be stored in this array
                pqs.add(w);
            }
        }
    }
}

考虑从节点1到2的有向路径与从节点1到2的无向路径之间的差异

您需要向有向图(您的算法可以解决该问题)添加什么,以使其等效于无向图

编辑:

我想,我知道了。提示如下:您当前正在for循环中更改重置v。这不会导致有向图出错,但如果边被列为从w到v,而不是从v到w的无向边,会发生什么情况

编辑2:

大概是这样的:

Edge e = new Edge(from, to, weight);
Edge f = new Edge(to, from, weight);

addEdge(e);
addEdge(f);
首先,删除
v=e.getV()

第二,将下一行更改为
intw=(v==e.getV())?e、 getW():e.getV()

这会将w的值设置为边v的哪个顶点不是

第二个建议相当于以下内容(可能更容易阅读):


必须添加两条不同的边,正边和反边。改变

public void addEdge(Edge e){
    adj[e.getV()].add(e);
    adj[e.getW()].add(e);
}

并且,当添加边时,按如下方式进行:

Edge e = new Edge(from, to, weight);
Edge f = new Edge(to, from, weight);

addEdge(e);
addEdge(f);

对于无向图,你必须考虑边-> B和B-> A,所以确保把它们都包含在一起,并再次运行该算法,如果它对有指导的情况起作用,则应该将剩下的EdgESi添加AdDeGE方法到我的问题中,请检查它。我已经在这两种情况下添加了边缘。我在问题中添加了addEdge方法,请检查。我已经在这两种情况下添加了边。@它们不同,但相同。堆空间错误听起来像是陷入了无限循环,如果仍然有v=e.getV()
public void addEdge(Edge e){
    adj[e.getV()].add(e);
}
Edge e = new Edge(from, to, weight);
Edge f = new Edge(to, from, weight);

addEdge(e);
addEdge(f);