最短路径--迪杰斯特拉(Dijkdtra)算法

迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。

它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。

算法思想

每次找到离源点最近的一个顶点,然后以该顶点为中心,然后得到源点到其他顶点的最短路径。贪心算法。

以邻接矩阵为存储图

注:图中,邻接矩阵的对称线也是无穷大,在初始时默认为无穷大。

dijkstra算法最短路径java dijkdtra最短路径算法_数组

(1) 用dis数组来存储源点1到其他顶点的初始路径,标记1号顶点,此时dis数组中的值称为最短路径的估计值。

dijkstra算法最短路径java dijkdtra最短路径算法_邻接矩阵_02

(2) 从dis数组中找出离源起点最近的点2号,以2号顶点为源点进行找最近的顶点。把2号顶点标记,表示已经有最小值。以2号顶点为源点,看2号顶点有哪些出边,看能不能优化,再短一些2->3:9,2->4:3而dis中最短路径的估计值,1->2:1, 1->3:12那么结合一下 1->2->3:1+9=10,比1->3:12 小,1->2:1 和 2->4:3,那么1->2->4:4所以要更新 dis中的最短路径估计值,

dijkstra算法最短路径java dijkdtra最短路径算法_提高级_03

(3) 此时1号和2号顶点已经标记,表示已经最小值,现在在3号和4号找,4号顶点距离源点最近,所以以4号顶点进行找,标记4号顶点4号的出边:4->3:4,4->5:13,4->6:15。用刚才的方法进行更新估计值。1->3:10 比 1->4->3:4+4=8,大,所以更新1->4:4,4->5:13+4=17,更新。1->4:4,4->6:15+4 = 19。更新

dijkstra算法最短路径java dijkdtra最短路径算法_dijkstra算法最短路径java_04

(4)从3号,5号,6号,找最短路径8,标记3号顶点。以相同的方法进行更新。

dijkstra算法最短路径java dijkdtra最短路径算法_提高级_05

(5)从5号和6号顶点查找,标记5号。以相同的方法进行更新。

dijkstra算法最短路径java dijkdtra最短路径算法_数组_06

(6)此时剩余6号顶点,6号的出边没有,此时所有的顶点都以遍历完,dis中的值就是最终的结果。

dijkstra算法最短路径java dijkdtra最短路径算法_dijkstra算法最短路径java_07

步骤:

(1)将所有的顶点分为两个部分,已知最短路径的顶点集合P和未知的顶点集合Q,初始时,P中只有一个源顶点1号。这里用book数组来标记顶点是否在P中,1表示在P中,0表示在Q中。dis数组来记录最短路径,数组下标来表示顶点的下标。设置源点1到到其他顶点的路径值,放置到dis中。
(2)在dis中找到源点s到其他顶点的最短路径u顶点,将其加入P集合,并考察以x顶点为起点的出边,然后对dis 进行更新。即:如果存在一条从u到v的边,那么可以拓展一条从s到u再到v的边,路径长度为dis[u]+edge[u] [v] ,如果这个值比目前的值dis[v]小,那么就进行更新。
(3)重复第2步,直到Q为空,即book都被标记,此时dis数组中就是源点到各个顶点的最短路径。
练习题
P1359 租用游艇
P3371【模板】单源最短路径(弱化版)
P4779【模板】单源最短路径(标准版)
CF910A The Way to Home
P1576 最小花费