所有节点对的最短路径问题

前面在《单源最短路径》中我们接触了最短路径问题,并介绍了求解最短路径问题的算法,比如Bellman-Ford算法,Dijkstra算法。不过,那里我们计算的是从一个固定的源节点到所有其他点的最短路径。假如我们要想求任意节点对之间的最短路径呢?一个方法是以所有节点作为源节点调用上述比如Dijkstra算法,如果使用二叉堆实现最小优先队列时间复杂度为O(VElgV),如果使用斐波那契堆来实现最小优先队
摘要由CSDN通过智能技术生成

前面在《单源最短路径》中我们接触了最短路径问题,并介绍了求解最短路径问题的算法,比如Bellman-Ford算法,Dijkstra算法。不过,那里我们计算的是从一个固定的源节点到所有其他点的最短路径。假如我们要想求任意节点对之间的最短路径呢?一个方法是以所有节点作为源节点调用上述比如Dijkstra算法,如果使用二叉堆实现最小优先队列时间复杂度为O(VElgV),如果使用斐波那契堆来实现最小优先队列时间复杂度为O(V^2lgV+VE)。如果图中包含权值为负的边,将不能使用Dijkstra算法,而只能用Bellman-Ford算法,时间复杂度为O(V^2E),稠密图的情况下,时间复杂度为O(V^4)。本文将介绍更加高效的算法。

1.Floyd-Warshall算法

首先要求图可以有负权值的边,但是不能有负权值的环。该算法采用的是动态规划来解决问题的。关于动态规划的更过内容可以参考前面的文章《动态规划专题(I)》《动态规划专题(II)》《动态规划专题(III)》,其中介绍了动态规划的知识以及大量用动态规划来解决的问题。

最短路径结构

Flyod-Worshall算法考虑的是一条最短路径上的中间节点。假定图G的所有节点为V = {1,2,...,n},Floyd-Warshall算法利用了路径p和从i到j之间中间节点取自集合{1,,2,...,k-1}的最短路径之间的关系(其中k是小于n的某个整数)。该关系依赖于节点k是否是路径p上的一个中间节点。

1.如果k不是路径p上的中间节点,则路径p上的所有中间节点都属于集合{1,,2,...,k-1}。因此,从节点i到节点j的中间取自集合{1,2,...,k-1}的一条最短路径也是从节点i到j的中间节点取自集合{1,2,...,k}的一条最短路径。

2.如果节点k是路径p上的中间节点,则将路径p分解为i--p1->k--p2-&

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值