迪杰斯特拉算法(Dijkstra's Algorithm)是一种用于解决图中单源最短路径问题的贪心算法。该算法以荷兰计算机科学家艾兹赫尔·迪杰斯特拉(Edsger Dijkstra)的名字命名。
以下是迪杰斯特拉算法的基本原理:
初始化: 创建两个数组,一个用于存储从起始顶点到每个顶点的当前已知最短路径的长度(通常称为dist
数组),另一个用于标记顶点是否已经包含在最短路径树中(通常称为sptSet
数组)。将dist
数组初始化为无穷大,除了起始顶点的距离为零。
选择最小距离顶点: 从未包含在最短路径树中的顶点中选择一个具有最小距离值的顶点。初始时选择起始顶点。
更新距离值: 对于选定的顶点,更新与其相邻顶点的距离值。如果通过选定的顶点到达相邻顶点的路径比当前已知的最短路径更短,则更新dist
数组中相邻顶点的距离值。
标记顶点: 将选定的顶点标记为已包含在最短路径树中(将相应的sptSet
数组元素设置为1)。
重复步骤2-4: 重复上述步骤,直到所有顶点都被包含在最短路径树中。
算法的核心思想是在每一步中选择当前最短路径,逐步扩展最短路径树,直到所有顶点都被包含。这确保了在算法运行结束时,dist
数组中包含的是起始顶点到图中每个顶点的最短路径长度。
需要注意的是,迪杰斯特拉算法对于权重不能为负值的图有效。如果图中存在负权边,可以考虑使用其他算法,如贝尔曼-福特算法。