📜  Dijkstra 在Java中使用 PriorityQueue 的最短路径算法(1)

📅  最后修改于: 2023-12-03 15:00:24.864000             🧑  作者: Mango

Dijkstra在Java中使用PriorityQueue的最短路径算法

Dijkstra算法是一种用于在加权有向图或无向图中找到单源最短路径的贪心算法。在此算法中,从源节点开始,每次选择当前节点到所有邻居节点的最小距离,并将该节点添加到最短路径树中。从未被遍历的节点中选择距离源节点最近的节点,并将其作为下一个遍历节点。这个过程会一直重复,直到所有节点被遍历。

在 Java 中使用 PriorityQueue 来实现 Dijkstra 算法能够快速和高效地找到最短路径。PriorityQueue 是一种基于优先级的队列,具有 O(log n) 的插入和删除元素的时间复杂度。

实现步骤
  1. 创建一个以源节点为根的最短路径树。
  2. 初始化 PriorityQueue,将源节点的距离设置为0,并将其插入PriorityQueue中。
  3. 对于 PriorityQueue 中的每一个节点,选择距离源节点最短的节点,并将其作为下一个遍历的节点。将其从 PriorityQueue 中删除,并将其加入最短路径树。
  4. 更新 源节点 到每个邻居节点的距离值,并将邻居节点插入 PriorityQueue,重复 第3 步 直到 PriorityQueue 为空。
代码实现
public void dijkstra(Graph graph, String source) {
    PriorityQueue<Node> queue = new PriorityQueue<>();
    Map<String, Integer> distances = new HashMap<>();
    Map<String, String> previous = new HashMap<>();

    for (String vertex : graph.getVertices()) {
        if (vertex.equals(source)) {
            distances.put(vertex, 0);
            queue.add(new Node(vertex, 0));
        } else {
            distances.put(vertex, Integer.MAX_VALUE);
            queue.add(new Node(vertex, Integer.MAX_VALUE));
        }
        previous.put(vertex, null);
    }

    while (!queue.isEmpty()) {
        Node current = queue.poll();

        if (distances.get(current.vertex) == Integer.MAX_VALUE) {
            break;
        }

        for (Edge edge : graph.getEdges(current.vertex)) {
            int alternateDist = distances.get(current.vertex) + edge.weight;

            if (alternateDist < distances.get(edge.to)) {
                distances.put(edge.to, alternateDist);
                previous.put(edge.to, current.vertex);

                queue.remove(new Node(edge.to, distances.get(edge.to)));
                queue.add(new Node(edge.to, alternateDist));
            }
        }
    }
}

这里的 graph 是我们定义的有向加权图,它包含顶点和边。Node 类是一个简单的包含顶点和距离的实体类。