Bellman–Ford 算法
此蒟蒻为大家科普一下
Bellman–Ford 算法是一种基于松弛(relax)操作的最短路算法,可以求出有负权的图的最短路,并可以对最短路不存在的情况进行判断。
在国内 OI 界,你可能听说过的「SPFA」,就是 Bellman–Ford 算法的一种实现。
过程
先介绍 Bellman–Ford 算法要用到的松弛操作(Dijkstra 算法也会用到松弛操作)。
对于边 (u,v),松弛操作对应下面的式子:dis(v)=min(dis(v),dis(u)+w(u,v))。
这么做的含义是显然的:我们尝试用 S→u→v(其中 S→u 的路径取最短路)这条路径去更新 v 点最短路的长度,如果这条路径更优,就进行更新。
Bellman–Ford 算法所做的,就是不断尝试对图上每一条边进行松弛。我们每进行一轮循环,就对图上所有的边都尝试进行一次松弛操作,当一次循环中没有成功的松弛操作时,算法停止。
每次循环是 O(m) 的,那么最多会循环多少次呢?
在最短路存在的情况下,由于一次松弛操作会使最短路的边数至少 +1,而最短路的边数最多为 n−1,因此整个算法最多执行 n−1 轮松弛操作。故总时间复杂度为 O(nm)。
但还有一种情况,如果从 S 点出发,抵达一个负环时,松弛操作会无休止地进行下去。注意到前面的论证中已经说明了,对于最短路存在的图,松弛操作最多只会执行 n−1 轮,因此如果第 n 轮循环时仍然存在能松弛的边,说明从 S 点出发,能够抵达一个负环。
结束了!
愣着干啥,散会