问题描述
给定一个图和图中的源顶点,找到从源到给定图中所有顶点的最短路径。
Dijkstra的算法与Prim的最小生成树算法非常相似。和Prim的MST一样,我们以给定的源为根,生成一个SPT(shortest path tree 最短路径树)。我们维护两个集合,一个集合包含最短路径树中包含的顶点,另一个集合包含尚未包含在最短路径树中的顶点。在算法的每一步,我们都会找到一个在另一个集合(尚未包含的集合)中的顶点,并且与源的距离最小。
下面是Dijkstra算法的详细步骤,用于寻找从单个源顶点到给定图中所有其他顶点的最短路径。
算法
- 创建一个集合sptSet(最短路径树集合),用来跟踪最短路径树中包含的顶点,即这个集合中的点到源的最小距离已经被计算和确定下来。开始的时候,这个集合是空的。
- 给输出图中的所有顶点分配一个距离值。初始化所有距离值为INFINITE。为源顶点分配距离值为0,这样它就会被首先选中。
- while sptSet不包含所有的顶点:
- 选取一个在sptSet中不存在的顶点u,并且它的距离值最小。
- 将u加入到sptSet中。
- 更新u的所有相邻顶点的距离值。要更新距离值,需要遍历所有相邻顶点。对于每一个相邻的顶点v,如果u的距离值(从源点)和边的权重之和小于v的距离值,那么更新v的距离值。
代码示例
1 | # Python program for Dijkstra's single |
参考
geeksForGeeks: https://www.geeksforgeeks.org/python-program-for-dijkstras-shortest-path-algorithm-greedy-algo-7/