BFS和贝尔曼福特、狄克斯特拉算法

关于这三个算法

  1. BFS通过队列实现层次遍历,就是由近及远地往外走,最早到达的一定时最短距离(路径权重相同)。
  2. 贝尔曼福特算法遍历每条边来更新节点的最短距离,第n轮的更新至少会得到由出发点出发,走过n个边的最短路径。所以只要n-1轮,就可以得到最短路径(最坏情况就是把每个节点都经过了,n个顶点n-1条边,想象一下这条路就像个链表)。
  3. 狄克斯特拉算法是每次找到还没遍历过的,离起点最近的点,通过它和它能到达的节点的距离,更新其他节点到起点的距离。当所有点都被看过以后,一定能找出最短路径。
关系
  • 他们都是搜索最短路径的算法,贝尔曼福特算法基于边{O(m+n)}而狄克斯特拉算法基于点{O(m+nlogn)}。
  • 狄克斯特拉算法和BFS比较像,BFS搜索优先级是看层次,而狄克斯特拉算法搜索的优先级是看离起点的远近。因为BFS路径权重都一样,所以只要简单地看下谁先入队谁先搜;
    而狄克斯特拉的话,有时某个点虽然直接和起点相连,但是由于路途比某些间接和起点相连的点还远,就肯定不先搜它啊。这时候可以用由小到大排列的数组(C++可以用set试下)来存储这些还没被遍历的点,近的先出来,先被遍历。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值