单源最短路径SSSP算法中使用了 松弛(relaxation)操作,即更新两点的最短路径
形象的理解:
原来用一根橡皮筋连接a、b两点,现在有一点v到b的距离更短,则用v点替换橡皮筋的a点,使得v、b连接在一起。这样缓解橡皮筋紧绷的压力,使其变得松弛,即松弛操作。
我们规定每个节点都有一个 dist 值,dist[v] 值记录的是从源点可达的顶点v的最短距离,每个节点也都有一个p指针指向他的前驱节点。松弛操作就是去更新 dist 的值。
源点是节点S,以S点为起点计算到A、B点的最短路径。
节点B的 dist 值为8,表示从源点 S 到 B之前的最短距离是8,而节点A的 dist 值为3,表示从源点 S 到 A 之前的最短距离是3。而当我们发现AB这个边时,以A为父节点,从 A 到 B 的距离比较近 3+2=5,比8要小,所以我们去更新 B 的 dist 值,同时把 B 的前驱节点设置成 A。这个过程就是松弛操作。
松弛操作 伪代码:对边(u,v)进行的松弛操作
每个单源最短路径算法中都会调用INITIALIZE-SINGLE-SOURCE,然后重复对边进行松弛的过程。另外,松弛是改变最短路径和前趋的唯一方式。各个单源最短路径算法间区别在于对每条边进行松弛操作的次数,以及对边执行松弛操作的次序有所不同。在Dijkstra算法以及关于有向无回路图的最短路径算法中,对每条边执行一次松弛操作。在Bellman-Ford算法中,每条边要执行多次松弛操作。