Dijkstra算法虽然好,但是不能解决带负权边的图。
想想Floyd-Warshall和Dijkstra算法,它们都是基于这样的事实:求两点之间的最短路径,看能否可以在路径中添加k个顶点来缩短路径。Dijkstra则是通过对dis数组进行V(顶点个数)轮松弛,得到单源最短路径。
而Bellman-Ford算法求最短路径是基于这样的事实:求两点之间的最短路径,看能否可以在路径中通过添加k条边来缩短路径。Bellman-Ford则是通过对dis数组进行E(边个数)轮松弛,得到单源最短路径。
Bellman-Ford算法可以用于检测是否有负权回路。
|
|
Bellman-Ford算法的队列优化:在每实施一次松弛操作后,就会有一些顶点已经求得最短路径,此后这些顶点的最短路径也不会变,这在后续松弛操作上浪费了时间,因而可以在每次松弛操作后,仅对最短路径估计值发生了变化的顶点的所有出边进行松弛操作。