参考资料《我的第一本算法书》
两种求解最短路径的算法:
🍗贝尔曼-福特算法;
🧀狄克斯特拉算法。
(1)贝尔曼福特算法
🍏首先设置各个顶点是权重:起点是0,其他顶点无穷大。
🍎更新顶点的值。用上一个顶点的值加上边的值,如果计算结果小于顶点的值,就更新,否则不更新。
🍐没有特定的顺序进行更新,但是每个顶点和每条边都要遍历到。
🍊若图的顶点数为n,变数为m,则整体的复杂度为O(mn)。
(2)狄克斯特拉算法
🍏首先设置各个顶点的初始权重:起点为0,其他顶点为无穷大。
🍎寻找可以从目前所在顶点直达且尚未被搜索过的顶点,使其成为候补顶点。
🍐更新候补顶点的值,方法与贝尔曼福特算法中的相同。
🍊从候补顶点中选出权重最小的顶点。
🍋之后若遇到有顶点值一样的时候,之前未考虑进来的顶点也要考虑进来。
🍉若图的顶点设为n,变数是m,如果事先不进行任何处理,该算法的时间复杂度为O(n^2),如果对数据结构进行优化,那么时间复杂度为O(m+nlogn)。
(3)贝尔曼福特算法和狄克斯特拉算法的比较
🍏贝尔曼福特算法可用于权重为负的时候,而狄克斯特拉算法不行。
🍎总体上看,狄克斯特拉算法在求最短路径上会更为高效。因为狄克斯特拉算法多了一步选择顶点的操作,即并不是所有的顶点都会经过。