JohnsonJohnson 是用来求带负权不带负环的全源最短路。

  1. 新建一个虚拟节点(00),从这个点向所有点连权值为 00 的边。
  2. 用死了的 SPFASPFABellmanFordBellman-Ford 求出以 00 为源点的最短路。
  3. 将(uuvv)的边权 ww 改为 w+huhvw+h_u-h_v
  4. 以每个点为起点用 DijkstraDijkstra 求出最短路。

时间复杂度:O(nmlogm)O(nmlogm)。空间复杂度:O(nm)O(nm)