一、基本思想
设共有N个节点,则进行N-1次循环,每一次循环中,针对每一个节点,计算其与起始点的最短距离并进行更新,并最终能够得到起始点到其余各点的最短路径。该算法与dijkstra算法相似,但不同之处在于,dijkstra算法每一次循环中更新与标号节点相连的未标号节点的最短距离,而bellman-ford算法则是在每一次循环中更新所有节点的最短距离,也正是因为这个差别,使得bellman-ford算法能够处理带负权弧的最短路问题并识别出是否存在负权回路。
以上图为例,共有6个节点,因此需要进行5次循环。以数组dist表示起始点0到各节点的最短距离,初始时dist[0]=0,其余均为inf。
则循环过程如下:
第一次循环:dist=[0, 3, 1, 6, 7, 10]
第二次循环:dist=[0, 2, 1, 6, 6, 9]
第三次循环:dist=[0, 2, 1, 6, 6, 9]
第四次循环:dist=[0, 2, 1, 6, 6, 9]
第五次循环:dist=[0, 2, 1, 6, 6, 9]
可以发现,其实第 i 次循环,就是找到了距离起始点 i 步以内的最短距离,也就是将每个节点作为距离起始点深度为 k (k < i) 的最短距离,而一个具有N个节点的图,最短路径的深度最大为N-1,因此最多需要N-1次循