Bellman–Ford 算法
  • 板块学术版
  • 楼主qiutian120529
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/6/1 15:17
  • 上次更新2024/6/1 15:25:00
查看原帖
Bellman–Ford 算法
701767
qiutian120529楼主2024/6/1 15:17

Bellman–Ford 算法

此蒟蒻为大家科普一下

Bellman–Ford 算法是一种基于松弛(relax)(relax)操作的最短路算法,可以求出有负权的图的最短路,并可以对最短路不存在的情况进行判断。

在国内 OI 界,你可能听说过的「SPFA」「SPFA」,就是 Bellman–Ford 算法的一种实现。

过程

先介绍 Bellman–Ford 算法要用到的松弛操作(Dijkstra 算法也会用到松弛操作)。

对于边 (u,v),松弛操作对应下面的式子:dis(v)=min⁡(dis(v),dis(u)+w(u,v))dis(v) = \min(dis(v), dis(u) + w(u, v))。

这么做的含义是显然的:我们尝试用 S→u→vS \to u \to v(其中 S→uS \to u 的路径取最短路)这条路径去更新 vv 点最短路的长度,如果这条路径更优,就进行更新。

Bellman–Ford 算法所做的,就是不断尝试对图上每一条边进行松弛。我们每进行一轮循环,就对图上所有的边都尝试进行一次松弛操作,当一次循环中没有成功的松弛操作时,算法停止。

每次循环是 O(m)O(m) 的,那么最多会循环多少次呢?

在最短路存在的情况下,由于一次松弛操作会使最短路的边数至少 +1+1,而最短路的边数最多为 n−1n-1,因此整个算法最多执行 n−1n-1 轮松弛操作。故总时间复杂度为 O(nm)O(nm)。

但还有一种情况,如果从 SS 点出发,抵达一个负环时,松弛操作会无休止地进行下去。注意到前面的论证中已经说明了,对于最短路存在的图,松弛操作最多只会执行 n−1n-1 轮,因此如果第 nn 轮循环时仍然存在能松弛的边,说明从 SS 点出发,能够抵达一个负环。

结束了!结束了!

愣着干啥,散会

2024/6/1 15:17
加载中...