算法逻辑:

1.给网络源点标上标号,其它点标上
2.遍历每条边 ,对每条边进行松弛操作
如果 ,更新结点 v;的标号
3.如果没有出现过更新操作,直接第5步,否则 重复2-3步n-1次。
4.如果最后一次遍历仍然有更新操作,则存在负环,没有最短路径。
5.算法结束;

接下来我们来讲述一下这个操作(如图):

        其中,0号顶点为原点,其他顶点都为表示正无穷(这里的0代表的是这个顶点的上一个最短路径的顶点,在完成松弛操作之后也会随之改变。),这里我们给每条边表上一个 序号,作为执行顺序。

第一遍:我们从1号边出发0->1 为(0,90),再从2号边出发0->3为(0,80),3号边0->为(0,75),4号边1->2为(1,60),5号边2->4为(2,70),6号边3->2为(3,50),7号边3->4不更新,第一遍完毕。

第二遍:1号边0->1不变(0,90)——2号边0->3不变(0,80)——3号边0->4  大于原本数,故不更新(2,70)——4号边1->2 大于原本数,故不更新——5号边2->4 (2,60)——6号边3->2不变——7号边3->4 大于原本数,故不更新。第二遍完毕。

第三遍:没有更新,故算法结束。

执行完之后0到各个顶点的最短距离为:

最后,我们来看一下负环的情况:

这里,我是将3号到4号的边改变了方向,使2、3、4号顶点之间的边形成一个负环(10+10+(-30)=-10),这会出现什么情况呢?

我们来重新查找最短路径:

第一遍:同上面一样。

第二遍:前面的1~6号边同上面一样,当执行到7号边时,4->3(4,70),第二遍结束。

第三遍:主要是6号边3->2 (3,40),其他都相同,第三遍结束。

第四遍:主要是5号边2->4  (2,50),7号边4->3(4,60),第四遍结束。

第五遍:主要是6号边3->2 (3,30),第五遍结束。

这里要注意,由于这个图只有五个顶点,当查找到第五遍时,如果还有顶点被更新,则说明这个算法中存在负环的情况,简称:无穷迭代是没有意义的。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐