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