Dijkstra无向图的最短路径

时间:2013-11-14 20:39:14

标签: 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] = 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);
}

2 个答案:

答案 0 :(得分:2)

考虑从节点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();
}

答案 1 :(得分:0)

您必须添加两个不同的边,直接边和反边。变化

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

并且,当您添加边时,请执行以下操作:

Sub test()
  start = Val(Range("A1").Value)
  For row = 1 To 1000
    Range("A" & row).Value = start + row
  Next
End Sub