📅  最后修改于: 2023-12-03 15:00:24.864000             🧑  作者: Mango
Dijkstra算法是一种用于在加权有向图或无向图中找到单源最短路径的贪心算法。在此算法中,从源节点开始,每次选择当前节点到所有邻居节点的最小距离,并将该节点添加到最短路径树中。从未被遍历的节点中选择距离源节点最近的节点,并将其作为下一个遍历节点。这个过程会一直重复,直到所有节点被遍历。
在 Java 中使用 PriorityQueue 来实现 Dijkstra 算法能够快速和高效地找到最短路径。PriorityQueue 是一种基于优先级的队列,具有 O(log n) 的插入和删除元素的时间复杂度。
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 类是一个简单的包含顶点和距离的实体类。