Floyd-Warshall算法 vs Johnson算法

两者都解决所有结点对最短路径问题,但Floyd-Warshall基于动态规划适合稠密图,Johnson结合Bellman-Ford与Dijkstra适合稀疏图。

共同点

  • 都解决所有结点对最短路径(APSP)问题,输出任意两顶点之间的最短距离
  • 都能正确处理负权边
  • 都能检测负权环(Floyd-Warshall通过检查 ,Johnson通过Bellman-Ford预处理)
  • 时间复杂度都优于对每个顶点运行Bellman-Ford的朴素方法

关键区别

维度Floyd-Warshall算法Johnson算法
时间复杂度 =
适用场景稠密图 时为 稀疏图 时显著优于FW)
核心思想动态规划,逐步放宽中间顶点约束重赋权 + 对每个顶点运行Dijkstra
负权处理天然支持负权边,无需预处理通过Bellman-Ford计算势函数 重赋权
实现复杂度简洁,三重循环即可实现较复杂,需组合Bellman-Ford和Dijkstra
空间复杂度(就地更新版本)(距离矩阵 + 势函数)
是否依赖优先队列是(Dijkstra需要优先队列)
交叉点 时FW更优 时Johnson更优

深层联系

两者在理论上是互补的。Floyd-Warshall的优势在于实现简洁和不依赖优先队列,但其 的时间在稀疏图上不够高效。Johnson算法通过重赋权技术巧妙地将负权问题转化为非负权问题,从而可以利用Dijkstra算法的高效性。重赋权的关键性质——新边权 且保持最短路径不变——是Johnson算法的理论核心。

在实际应用中,选择哪个算法取决于图的密度:稠密图选Floyd-Warshall,稀疏图选Johnson。两者的分界点大约在 附近。

参见