算法——所有节点对的最短路径:Floyd-Warshall算法、Johnson算法

前言

    前面介绍了单源最短路径问题,本文是介绍所有节点对的最短路径问题,首先我们会想到用前面所介绍的知识来求解该问题,根据不同类型的图可以用一下几种方法求解:

  1. 若无权重的图,则可以使用BFS,时间复杂度是;
  2. 若为非负权重边的图,则可以使用Dijkstra算法,不同的优先队列实现得到不同的时间复杂度:①线性数组,。②二叉堆,,在稀疏图的情况下是一个较大的改进。③斐波那契堆,;
  3. 若含有负权重边的图,则可以使用Bellman-Ford算法,稠密的情况下时间复杂度是为
  为了降低时间复杂度,我们下面采用 Floyd-Warshall 算法和 Johnson 算法进行求解。

Floyd-Warshall算法

    该算法的原理是动态规划,并且图的表示方式是邻接表矩阵。根据动态规划的求解步骤:

  1. 分析最优解结构;
  2. 递归定义最优解的值;
  3. 自底向上计算最优解的值;
  4. 根据计算出的最优解的值构造最优解;

    使用该算法是可以存在负权值的边,但不能存在权值为负值的环路。在求解之前先介绍基本概念:

    中间节点:简单路径的中间节点是指路径上除节点和节点之外的任意节点,也就是处于集合中的节点。

Floyd-Warshall算法的求解步骤:

最短路径结构(最优解结构)

    假定图的所有节点为,考虑其中一个子集,的某个整数。对任意节点,考虑从节点到节点的所有中间节点均取自集合的路径,并且设为其中权重最小的路径。Floyd-Warshall算法利用路径和从节点到节点之间中间节点均取自集合的最短路径之间的关系。该关系依赖于节点是否是路径上的一个中间节点。

  1. 若节点不是路径
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值