前言
前面介绍了单源最短路径问题,本文是介绍所有节点对的最短路径问题,首先我们会想到用前面所介绍的知识来求解该问题,根据不同类型的图可以用一下几种方法求解:
- 若无权重的图,则可以使用
次BFS,时间复杂度是
;
- 若为非负权重边的图,则可以使用
次Dijkstra算法,不同的优先队列实现得到不同的时间复杂度:①线性数组,
。②二叉堆,
,在稀疏图的情况下是一个较大的改进。③斐波那契堆,
;
- 若含有负权重边的图,则可以使用
次Bellman-Ford算法,稠密的情况下时间复杂度是为
;
Floyd-Warshall算法
该算法的原理是动态规划,并且图的表示方式是邻接表矩阵。根据动态规划的求解步骤:
- 分析最优解结构;
- 递归定义最优解的值;
- 自底向上计算最优解的值;
- 根据计算出的最优解的值构造最优解;
使用该算法是可以存在负权值的边,但不能存在权值为负值的环路。在求解之前先介绍基本概念:
中间节点:简单路径的中间节点是指路径
上除节点
和节点
之外的任意节点,也就是处于集合
中的节点。
Floyd-Warshall算法的求解步骤:
最短路径结构(最优解结构)
假定图的所有节点为
,考虑其中一个子集
,
的某个整数。对任意节点
,考虑从节点
到节点
的所有中间节点均取自集合
的路径,并且设
为其中权重最小的路径。Floyd-Warshall算法利用路径
和从节点
到节点
之间中间节点均取自集合
的最短路径之间的关系。该关系依赖于节点
是否是路径
上的一个中间节点。