SPFA算法实例分析 【图解+详细松弛操作】

SPFA算法实例分析 【图解+详细松弛操作】_第1张图片

如图所示一个有6个结点的有向图,权值均已给出,设置一个dis数组来记录V1到各个顶点的最短路径,采用SPFA算法对上图求V1到各个顶点的最短路径,通过手动的方式来模拟SPFA每个步骤的过程。
初始化:初始化dis数组如下表所示:(除了源点赋值为0外,其它顶点的对应的dis的值都赋予无穷大,这样有利于后续的松弛)

V1 V2 V3 V4 V5 V6
0

此时V1入队列:{V1}
现在进入循环,直到队列为空才推出循环
第一次循环: 对首元素出队列,即是V1出队列,然后以V1为弧尾的边对应的弧头顶点进行松弛操作,可以发现V1到V3,V5,V6三个顶点的最短路径变短了,于是更新dis数组相关的值

V1 V2 V3 V4 V5 V6
0 10 30 100

发现V3,V5,V6都被松弛了,而且不在队列中,将它们加入队列:{ V3, V5, V6}
第二次循环: 此时,队首元素为V3,V3出队列,然后以V3为弧尾的边对应的弧头顶点进行松弛操作,可以发现V1到V4的边,经过V3松弛变短了,于是更新dis数组相关的值

V1 V2 V3 V4 V5 V6
0 10 60 30 100

发现只有V4对应的值被更新了,而且不在队列中,将它加入队列:{ V5, V6, V4}
第三次循环: 此时,队首元素为V5,V5出队列,然后以V5为弧尾的边对应的弧头顶点进行松弛操作,可以发现V1到V4和V6的最短路径,经过V5松弛变短了,于是更新dis数组相关的值。

V1 V2 V3 V4 V5 V6
0 10 50 30 90

发现V4,V6对应的值都被更新了,但是都处于队列中了,所以不用对队列做任何操作,队列值为:{ V6, V4}

第四次循环: 此时,队首元素为V6,V6出队列,然后以V6为弧尾的边对应的弧头顶点进行松弛操作,发现V6出度为0,所以不用对dis数组做任何操作,结果与上文表4.3.4一样,同样队列不用做任何操作,队列值为:{V4}

第五次循环: 此时,队首元素为V4,V4出队列,然后以V4为弧尾的边对应的弧头顶点进行松弛操作,可以发现V1到V6的最短路径,经过V4松弛变短了,于是更新dis数组相关的值。

V1 V2 V3 V4 V5 V6
0 10 50 30 60

因修改了V6对应的值,且V6不在队列中,于是把V6加入队列,队列值{V6}

第六次循环: 此时,队首元素为V6,V6出队列,然后以V6为弧尾的边对应的弧头顶点进行松弛操作,发现V6出度为0,所以不用对dis数组做任何操作,结果与上文表4.3.5一样,同样队列不用做任何操作,此时队列为空。

V1 V2 V3 V4 V5 V6
0 10 50 30 60
学如逆水行舟,不进则退

你可能感兴趣的:(算法,SPFA算法实例分析,【图解+详细松弛操作】,SPFA)