必会算法总结(4) - 迪杰斯特拉算法
迪杰斯特拉算法的核心在于贪心+BFS。它和上一篇介绍到的拓扑排序一样属于图论算法,是大学计算机专业必学的算法之一,也是笔试经常出的算法。那么下面让我们一起来学习迪杰斯特拉算法的实现。
算法思想
迪杰斯特拉算法需要维护以下两张列表:
- visited:记录已经计算出最短路径的节点
- shortest:记录到达每个节点的最短路径
每次选取shortest
中的权值最小的节点加入visited
中,并实时维护shortest
列表。
图的存储实现
在本次实例中我选用图的邻接表存储结构:
-
Node类
public class Node { int value; Map<Node, Integer> neighbors; public Node() { } public Node(int value) { this.value = value; } public Node(int value, Map<Node, Integer> neighbors) { this.value = value; neighbors = this.neighbors; } }
-
Graph类
public class Graph { List<Node> nodes; public Graph() { } public Graph(List<Node> nodes) { this.nodes = nodes; } }
算法核心
下列代码是迪杰斯特拉算法的核心,我们使用Integer.MAX_VALUE
来表示无穷大:
public Map<Node, Integer> shortestPath(Graph graph, Node source) {
// 创建列表shortest和visited
Map<Node, Integer> shortest = new HashMap<>();
Set<Node> visited = new HashSet<>();
// 初始化每个node的值为Integer.MAX_VALUE
for (Node node : graph.nodes) {
shortest.put(node, Integer.MAX_VALUE);
}
// 设置源点source
shortest.put(source, 0);