Dijkstra算法用于解决单源最短路径问题,即,从一个节点出发,计算该结点到图中其他节点的最短距离。
算法思想:
Dijsktra提出了一个按路径长度递增的顺序逐步产生最短路径的算法。设置两个结点集合S、T,分别存储已经找到最短路径的节点和还未找到最短路径的结点。初始时,S中只有其实结点v,然后从T中寻找到v的路径长度最短的结点,将此点加入S。每次有新的结点u加入S后都需要更新T中节点到v的路径距离,路径距离的值是“原来的当前最短路径长度值”和“从源点经过节点u到该结点 的路径长度”中的较小者。其中,从源点经过节点u到该结点 的路径长度=节点u到源节点的最短路径长度+u到待更新结点的边权值。重复,直到T中所有结点全部加入到集合S中。
示例:
参考:https://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html
计算A到其他所有节点的最短距离,表中红色节点表示S中结点,黑色表示T中节点。
1、初始时,与A邻接的点的最短路径距离为其与A之间边的权重,不邻接的点到A的距离计为无穷
结点 | A | B | C | D | E | F |
---|---|---|---|---|---|---|
到源点的最短路径距离 | 6 | 3 | – | – | – |
2、 寻找T中到v的最短路径距离最短的结点,加入s(此例中为C),此时该结点对应的最短路径距离就是该节点到源节点的最终最短距离。
3、更新其余节点到源节点的最短路径距离,dis=min{当前最短路径距离,经过2中加入S的结点再到源节点的路径距离}
结点 | A | B | C | D | E | F |
---|---|---|---|---|---|---|
距离 | 5(3+2) | 3 | 6(3+3) | 7(3+4) | – |
4、重复2-3
结点 | A | B | C | D | E | F |
---|---|---|---|---|---|---|
距离 | 5 | 3 | 6 | 7 | – |
选择所有未被访问结点中到源节点最短路径距离最短的结点B加入S,更新在允许经过节点B的情况下其余结点到源节点的最短路径距离)
结点 | A | B | C | D | E | F |
---|---|---|---|---|---|---|
距离 | 5 | 3 | 6 | 7 | 9(6+3) |
选择所有未被访问结点中到源节点最短路径距离最短的结点D加入S,更新在允许经过节点D的情况下其余结点到源节点的最短路径距离
结点 | A | B | C | D | E | F |
---|---|---|---|---|---|---|
距离 | 5 | 3 | 6 | 7 | 9 |
选择所有未被访问结点中到源节点最短路径距离最短的结点E加入S,更新在允许经过节点E的情况下其余结点到源节点的最短路径距离
结点 | A | B | C | D | E | F |
---|---|---|---|---|---|---|
距离 | 5 | 3 | 6 | 7 | 9 |
选择所有未被访问结点中到源节点最短路径距离最短的结点F加入S,此时T为空,结束循环