介绍
贝尔曼-福特算法(Bellman-Ford)是由理查德·贝尔曼(Richard Bellman) 和 莱斯特·福特 创立的,是求解单源最短路径问题的一种算法。时间复杂度为O(nm),他可以解决边权为负数时的最短路问题(Dijkstra算法不可以),当然还有SPFA算法(实际上是Bellman—Ford算法的优化)。该算法的特别用处是通过k次迭代,得到从源点到终点最多不经过k条边的的最短路径。也可以用于是否存在负环,但一般用SPFA算法判断师傅存在负环。
原理,思路
主要由两层循环实现,外层循环k次代表源点到终点最多不经过k条边的最短路径,内层循环则历所有的边。初始时源点的距离为dist[1]=0,内层循环每遍历一条边就是对这条边进行一次“松弛操作”,即假设现在有一条从a指向b的边,权重为w,“松弛操作”就是检查此时的dist[b]和dist[a]+w哪个更小,即满足dist[b]<=dist[a]+w;简单的来说就是看从源点到b的距离短还是从源点经过a这个"中转点"再到b的距离短。需要注意的是,用来中转的a点的dist