Dijkstra 和 Bellman-Ford算法以及spfa判断负环路

博客先介绍了Dijkstra算法思想,包括用dis[]数组存放最短距离、广度遍历逐层更新等,还说明了其贪心求解特点及不能处理负权边的原因。接着阐述了Bellman_ford算法,每次对所有边松弛可确定一个点的最短距离,循环n - 1次可确定所有点。最后提及spfa判断负环路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在说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[] 数组中更新后的值,不一定就是最优解<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值