参考《算法导论》
在求图的最小生成树是会用到与切割相关的性质,而松弛操作是求单源最短路径中一个必不可少的步骤。
无向图G =(V, S)的一个切割(S, V—S)是集合V的一个划分,如下图所示,如果一条边(u, v)∈E的一个端点位于集合S,另一个端点位于结合V—S,则称该条边横跨切割(S, V—S)。如果结合A中不存在横跨该切割的边,则称该切割尊重集合A。在横跨一个切割的所有边中,权重最小的边称为轻量级边(轻量级边可能不是唯一)。一般的,如果一条边是满足某个性质的所有边中权重最小的,则称该条边是满足给定性质的一条轻量级边。
松弛操作
对于每个结点v来说,我们维持一个属性v.d,用来记录从源结点s到结点v的最短路径权重的上界。我们称v.d为s到v的最短路径估计(shortest-path estimate)。下面伪代码对最短路径估计和前驱结点进行初始化:
对一条边(u, v)松弛的过程为:首先测试一下是否可以对从s到v的最短路径进行改善。测试的方法是,将从结点s到结点u之间的最短路径距离加上结点u与v之间的边权重,并与当前的s到v的最短路径估计进行比较,如果前者更小,则对v.d和v.π进行更新。松弛操作可能降低最短路径的估计值v.d并更新v的前驱属性v.π。下面伪代码对边(u, v)经行松弛操作: