最短路径问题——Dijkstra算法的理解
1、最短路径的概念
从一个顶点到另一个顶点所经过的边的权重和最小的一条路径,即最短路径。
Dijkstra算法通常用来解决无负权边的图的最短路径问题,算法复杂度O(Elog(V))。
2、算法思路
首先在图中任意选定好顶点,比如0。创建一个数组(最好是最小索引堆),其用来存储与顶点0相连的点的最短距离。由第一张图可以看出,目前除了0点本身距离为0,其他的顶点距离都还没记录。不急。
第二步,我们从顶点0出发,遍历一遍与顶点0相连的边,在数组中记录下权重。
由图片我们可以很明显的看出,0到2的距离是最短的,这也意味着0不管走哪条路线到2,不可能比该条路线要短,因此记录下每个顶点距离后,我们既可以确定0-2已经是最短路径,也可以确定如果0到别的节点有别的更短路径,那么肯定要经过2。我们拿2出来进行遍历邻边。
由于2到1的距离加上0-2的距离要小于0直接到达1的距离,因此在表中更新距离数据,这样的操作专业术语叫松弛(relaxation)。由于2已经遍历过,加上此时确定0-2-1是0到达1的最短路径,所以接下来从没有遍历过的距离最短的点1中出发遍历。
以此种方法遍历完所有的顶点后,即找出了图中顶点0到任一顶点的最短路径,路径长度存储在该数组中。