迪杰斯特拉算法
迪杰斯特拉算法(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]; Arrays.fill(DIS, Integer.MAX_VALUE); VISITED = new boolean[N + 1]; dijkstra(); 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知识。
如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !