适用于求解没有负环的全源最短路,最坏时间复杂度 \(O(nm\log m)\) 比Floyd要优秀(但是Floyd可以找出负环)。
在没有负权边时,使用n次单源最短路Dijkstra代替即可。
算法流程:
1、新建一个虚拟节点(编号为n+1),向[1,n]连接一条边权为0的虚拟边。
2、从n+1号节点开始跑一次队列优化BellmanFord,得到从n+1号虚拟节点到节点i的最短路hgt[i],假如存在负环,则无法求解。
3、删除虚拟节点和虚拟边(也可以直接选择忽视他们)
4、把每条非虚拟边(u,v,w)改为(u,v,w+hgt[u]-hgt[v])
5、对于每个点i属于[1,n],跑一次Dijkstra,得到从i节点到[1,n]的非虚拟节点的最短路dis[j]。
6、原本的[i,j]的最短路为dis[j]+hgt[i]-hgt[j]