Dijkstra算法

Dijkstra算法是用来求最路径的算法, 是求单源最短路径的算法;

从图中的某个顶点出发到达另外一个顶点的所经过的边的权重和最小的一条路径,称为最短路径

这里要注意的是,我们要求的是某一特定的点到其他点的最短路径,起点是确定的。

算法流程

假设起点为s

  1. 一开始我们根据已知条件建立一个距离矩阵,一般为二维矩阵,matrix[i][j]表示点i到j之间的距离(注意有向无向的区别)。如果已知条件中没有给出两个点的距离,那么matrix[i][j]距离为无限大。

  2. 将所有的点分成两个集合,doneundo, 起点到done集合中的点的距离是确定的、是最短的,一旦加入不会改变undo集合中的点表示其最短还没确定下来。开始的时候done集合中只有起点,其到自身的距离为0。undo集合为起点以外的所有点。)

  3. 遍历undo中的所有点,取其中到起点距离最小的点p,将其加入done集合中,并从undo集合中删除

  4. 更新undo中的所有点,因为第3步中我们已经选出了一个点p,那么我们以p点为中转站,更新起点到undo中所有点的距离:
    m a t r i x [ s ] [ d ] = m i n ( m a t r i x [ s ] [ d ] , m a t r i x [ s ] [ p ] + m a t r i x [ p ] [ d ] ) f o r    d    i n    u n d o matrix[s][d] = min(matrix[s][d], matrix[s][p] + matrix[p][d]) for \space \space d \space \space in \space \space undo matrix[s][d]=min(matrix[s][d]matrix[s][p]+matrix[p][d])for  d  in  undo

  5. 重复3-4过程直到undo集合为空, 或者过程3中选出的最小距离为无限大(因为此时undo中的点都不再可达)。

如果题目要求输出具体路径,可以再用一个二维矩阵prev, prev[i][j]表示i到j点要经过的点, 然后从终点往前推即可。

以743. Network Delay Time 来解释 Dijkstra算法, leetcode 743题解

你可能感兴趣的:(算法与数据结构)