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