SPFA算法简介
SPFA算法采用图的存储结构是邻接表,方法是动态优化逼近法。算法中设立了一个先进先出的队列Queue用来保存待优化的顶点,优化时从此队列里顺序取出一个点w,并且用w点的当前路径D[W]去优化调整其它各点的路径值D[j],若有调整,即D[j]的值改小了,就将J点放入Queue队列以待继续进一步优化。反复从Queue队列里取出点来对当前最短路径进行优化,直至队空不需要再优化为止,此时D数组里就保存了从源点到各点的最短路径值 。
下面举一个实例来说明SFFA算法是怎样进行的:
设有一个有向图G={V,E},其中,V={V0,V1,V2,V3,V4},E={<V0,V1>,<V0,V4>,<V1,V2>,<V1,V4>,<V2,V3>,<V3,V4>,<V4,V2>}={2,10,3,7,4,5,6},见下图:
算法执行时各步的Queue队的值和D数组的值由下表所示。
表一 实例图SPFA算法执行的步骤及结果
初始 | 第一步 | 第二步 | 第三步 | 第四步 | 第五步 | ||||||
queue | D | queue | D | queue | D | queue | D | queue | D | queue | D |
V0 | 0 | V1 | 0 | V4 | 0 | V2 | 0 | V3 | 0 |
| 0 |
| ∞ | V4 | 2 | V2 | 2 |
| 2 |
| 2 |
| 2 |
| ∞ |
| ∞ |
| 5 |
| 5 |
| 5 |
| 5 |
| ∞ |
| ∞ |
| ∞ |
| ∞ |
| 9 |
| 9 |
| ∞ |
| 10 |
| 9 |
| 9 |
| 9 |
| 9 |
算法执行到第五步后,队Queue空,算法结束。源点V0到V1的最短路径为2,到V2的最短路径为5,到V3的最短路径为9,到V4的最短路径为9,结果显然是正确的。