Bellman - Ford算法和SPFA算法

  给定一张有向图,若对于图中的某一条边(x, y, z),有 dist[y] ≤ dist[x] + z 成立,则称该边满足三角形不等式。若所有边都满足三角形不等式,则 dist 数组就是所求最短路。
  先介绍基于迭代思想的Bellman-Ford算法。它的流程如下:
  1.扫描所有边(x,y,z),若 dist[y] > dist[x] + z,则用 dist[x]+z 更新 dist[y]。
  2.重复上述步骤,直到没有更新操作发生。
  Bellman-Ford 算法的时间复杂度为0(nm).
  实际上,SPFA算法在国际上通称为“队列优化的Bellman-Ford算法”,“SPFA”是Shortest Path Fast Algorithm的缩写。
SPFA 算法的流程如下:
  1.建立一个队列,最初队列中只含有起点1。
  2.取出队头节点x,扫描它的所有出边(x, y, z),若 dist[y] > dist[x] + z,则使用 dist[x] + z 更新 dist[y]。同时,若y 不在队列中,则把y入队。
  3.重复上述步骤,直到队列为空。
  在任意时刻,该算法的队列都保存了待扩展的节点。每次入队相当于完成一次dist数组的更新操作,使其满足三角形不等式。一个节点可能会入队、出队多次。最终,图中节点收敛到全部满足三角形不等式的状态。这个队列避免了 Bellman-Ford 算法中对不需要扩展的节点的冗余扫描,在随机图上运行效率为O(k * m)级别,其中k是一个较小的常数。但在特殊构造的图上,该算法很可能退化为O(n * m),必须谨慎使用。

待更新。。。。。。

©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页