迪杰斯特拉(Dijkstra)算法模板

个人算法练习总结贴

Posted by Jeremy Song on 2022-06-12
Estimated Reading Time 2 Minutes
Words 551 In Total
Viewed Times

迪杰斯特拉算法

迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。

注意:注意该算法要求图中不存在负权边。

迪杰斯特拉算法是在BFS算法的基础上变化而来,BFS算法实现请参考 BFS DFS 解题模板

算法模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import java.util.*;

/**
* 迪杰斯特拉算法标准模板
*/
public class Dijkstra {
static int N, A, B; // 点个数,起始位置,结束位置
static Map<Integer, Set<Integer>> LINKS; // 链接点的路径

static int[] DIS; // 每个点到起始位置的距离
static boolean[] VISITED; // 点是否访问的标记(没有这个不影响结果,有这个是因为时间性能上的优化)

public static void main(String[] args) {
LINKS = new HashMap<>(); // 路径初始化忽略
DIS = new int[N + 1]; // A,B从1开始计数
Arrays.fill(DIS, Integer.MAX_VALUE);
VISITED = new boolean[N + 1];
dijkstra();
// -1表示不可达
System.out.println(DIS[B] == Integer.MAX_VALUE ? -1 : DIS[B]);
}

/**
* 迪杰斯特拉算法实现
*/
private static void dijkstra() {
// 使用优先队列(可根据实际情况调整排序算法,此处最小优先)
Queue<Integer> queue = new PriorityQueue<>(Comparator.comparing(x -> DIS[x]));
// 设置起始位置状态
queue.offer(A);
DIS[A] = 0;
VISITED[A] = true;

while (!queue.isEmpty()) {
Integer curr = queue.poll();

if (curr == B) {
return; // 结束位置达到,退出
}

if (!LINKS.containsKey(curr)) {
continue; // 无后续的路径可走
}

for (Integer next : LINKS.get(curr)) {
if (!VISITED[next] && DIS[curr] + 1 < DIS[next]) {
// 没有访问的点,并且路径此时最小,则更新距离和访问标记
DIS[next] = DIS[curr] + 1;
VISITED[next] = true;
// 新的下一个点加入队列
queue.offer(next);
}
}
}
}
}

欢迎关注我的公众号 须弥零一,跟我一起学习IT知识。


如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !