一、算法概述
- Bellman-Ford算法,也可以翻译成中文“贝尔曼-福特算法”,常常拿来和Dijkstra算法一起比较理解。
- Bellman-Ford算法的原理是对图进行 V-1 次松弛操作,算法的复杂度高达O(VE)。但是相对于Dijkstra算法,尽管算法复杂度稍高一些,但是它能处理带负权值边而没有负权回路的图。V-1次松弛操作,必定能求出最短路径,因为图的深度最多为V-1.
二、实现步骤
- 数组 distance[v] 表示从源点source到顶点v的最短路径,即为要求的答案。
- 数组 predecessor[v] 表示从源点source到顶点v的最短路径p(s,....,v),顶点v的前一个节点。可以由此数组导出一个前驱子图或以source为根的最短路径树。
- w表示边 (u,v) 的权值。
- 初始化操作:一开始从source到自己的距离为0,到其他所有点的最短距离为正无穷大。
- 进行 V-1 次松弛操作:每一次对所有的边遍历一遍,若distance[u] + w < distance[v],则更新distance[v]和predecessor[v]。
- 检查是否存在负权回路:对每条边遍历一遍,若仍然可以更新distance,说明存在负权回路。
三、伪代码实现
摘自维基百科的贝尔曼