bellman算法中对于负权重环路的判断依据是:松弛完成后,遍历全部有向边,若发现某边终点到源点的最短路径(以下简称边终点)v.d大于边起点到源点路径u.d(以下简称边起点)与边权重w之和,即v.d>u.d+w,则说明原图存在负权重环路,单源最短路径不存在.

如何理解v.d>u.d+w?

回顾我们松弛的条件:v.d=min(v.d, u.d+w),换句话说,边终点总是小于等于边起点与边权重之和,又因为我们一直都遵循松弛条件,正常来说每个边终点都会小于等于边起点与边权重之和.

若结果发现边终点大于边起点,那么一定是出现负权重环路了,因为在负权重环路存在时,使一条边遵循松弛条件必定会破坏另一边的松弛条件,此处引入了破坏松弛条件的因素,导致结果会有不满足松弛条件的边出现

例如,有一端点A,当前到源点的距离为10;另一端点B,当前到源点的距离为12;边E_AB为从A到B的边,权重为-1;边E_BA反之,权重为-3;

bellman运行时:

1.对E_AB松弛,使之满足松弛条件,B=min(10+(-1),12)=9,故B到源点的距离变为9,A为10不变

2.对E_BA松弛,A=min(9+(-3),10)=6,故A到源点的距离变为6,B为9不变

现在E_BA满足松弛条件了,那E_AB呢? B>A+(-3), E_BA并不满足松弛条件. 因为在E_BA满足松弛条件的同时破坏了E_AB的松弛条件.

所以当松弛操作结束后,发现有不满足松弛条件的边即可判定原图中存在负权重环路,此时算法返回false.

posted on 2019-05-13 18:41  SHQHDMR  阅读(494)  评论(0编辑  收藏  举报