图的最短路径—Floyd算法和Bellman-Ford算法
Floyd算法
借助邻接矩阵辅助,Floyd算法可以解决数据量不大,且权值中有负数的图,但不能是存在负环的图的最短路径问题。该算法步骤如下:
- 在
n
个节点中寻找”跳点”bridge
- 如果
graph[from][bridge] != INT_MAX && graph[bridge][to] != INT_MAX && graph[from][bridge] + graph[bridge][to] < graph[from][to]
则更新邻接矩阵
1 | for (int bridge = 0; bridge < n; ++bridge) { |
显而易见,floyd算法的时间复杂度是O(n^3)
空间复杂度是O(n^2)
Bellman-Ford算法
Bellman-Ford 可以解决权值中存在负数,但不能存在负环的图,找出任意两点的最短路径问题。该算法步骤如下:
- 初始化
distance
数组 即vector<int>distance(n, INT_MAX);
- 对所有边进行
n-1
的“松弛”(取最小值)操作
算法模版如下:
1 | vector<int> distance(n, INT_MAX); |
Bellman-Ford算法的时间复杂度为 O(n^2)
空间复杂度为O(n)