计算路径 - Dijkstra的算法

时间:2017-12-30 19:53:43

标签: java algorithm dijkstra

我看到了dijkstra算法的实现,我对此代码的某些部分并不十分理解:

public static void computePaths(Vertex source) {
    source.minDistance = 0;
    PriorityQueue<Vertex> vertexQueue = new PriorityQueue<Vertex>();
    vertexQueue.add(source);

    while (!vertexQueue.isEmpty()) {
        Vertex u = vertexQueue.poll();

        // Visit each edge exiting u
        for (Edge e : u.adjacencies) {
            Vertex v = e.target;
            double distanceThroughU = u.minDistance + e.getweight();
            if (distanceThroughU < v.minDistance) {
                vertexQueue.remove(v);      //How can I remove if I didn't add it first, and why do I need to remove?
                v.minDistance = distanceThroughU;
                v.previous = u;
                vertexQueue.add(v);        //Why is it add again?
            }
        }
    }
}

我读到了关于dijkstra算法的知识,所以我知道了一般的逻辑,但是当我看到这个实现时,有一些事情我不明白它们为什么要完成。有人可以试着解释一下吗?特别是我有评论的地方!

1 个答案:

答案 0 :(得分:2)

更新节点v的信息

您希望更新存储在优先级队列中的节点v的信息,因为您找到了更短的路径。

Remove()函数删除优先级队列中存在的 >节点。

之后,您更新信息,然后使用更新的信息再次添加。