在说bellman_ford算法前,先解释dijkstra算法的思想
我们用 dis[ ] 数组来存放 i 点到起点的最短距离
1、首先它是从起点开始,广度遍历,逐层更新,靠近起点的先被确定最终距离
2、如果我们要更新 dis[y] 的最短距离,则一定用比它距离要短的 dis[x] 来更新
如果dis[y]为全局最短,则dis[y] 不会再被更新,因为没有更短的 dis[x]值可以来更新它
3、那我们每次找全局最短的距离 dis[x] 来更新dis[y]
为什么dis[] 数组中最小的值就一定是i 点的最短距离
因为我们是从起点开始广度遍历,那么所有的未知点一定是由已知点进行更新的,即dis[ 未知点 ] > dis[已知点]
所以不会通过未知点再次更新已知点的距离,只用在已知点中找到最小的,即为最短距离
为什么一定要用全局最短?
全局最短的距离是确定的,不会再被更新,所以连上的边也是确定的,不会再被更改
如果不是全局最短,此时用此点( 设为u )去更新其他点,而u更新其他点(设为y)一次后,u就不会再次用来更新
而u再次被缩小时,y就不会再次更新
4、贪心求解,每次 dis[] 数组中更新后的值,不一定就是最优解<