【问题标题】:Dijkstra shortest path for an undirected graph无向图的 Dijkstra 最短路径
【发布时间】:2013-11-14 20:39:13
【问题描述】:

我的以下代码对于有向图非常有效,当给定无向图时,它不会返回最短路径。

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);
            }
        }
    }
}

我不确定我的错误是什么?我有点确定这是一个简单的错误,一些提示可以解决问题。

谢谢。

编辑:

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

【问题讨论】:

  • 对于无向图,您必须考虑边 A -> B 和 B -> A,因此如果适用于有向情况,请确保包含它们并再次运行算法,它应该可以添加剩余的边缘
  • 我在我的问题中添加了 addEdge 方法,请检查一下。我已经在这两种情况下都添加了优势。

标签: java graph dijkstra shortest-path


【解决方案1】:

考虑从节点 1 到 2 的有向路径与从节点 1 到 2 的无向路径之间的区别。

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

编辑:

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

EDIT2:

类似这样的:

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

其次,将下一行改为int w = (v == e.getV()) ? e.getW() : e.getV();

这会将 w 的值设置为边 v 不是的任何顶点。

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

int w = e.getW();
if (w == v) {
    w = e.getV();
}

【讨论】:

  • 我在我的问题中添加了 addEdge 方法,请检查一下。我已经在这两种情况下都添加了优势。
  • @void 它们不同,但等效。堆空间错误听起来就像你陷入了一个无限循环,如果你仍然有 v = e.getV() 就会发生这种情况
【解决方案2】:

您必须添加两个不同的边,即正边和逆边。改变

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

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);

【讨论】:

    猜你喜欢
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多