图的最短路径问题(Shortest Path)

没整理完

单源最短路径:一个端点到其他点的最短路径
多源最短路径:多个端点到各自端点以外端点的最短路径
端点:vertex,数量为V
松弛: 原本存了目前计算出的最短路径在比较后有更短的路径,进行更新,这叫做松弛就好像橡皮圈原本很大慢慢收缩

1、广度优先搜索算法(解决单源最短路径,解决无权最短路径)

该方法通过BFS暴力遍历获取一顶点到其他所有顶点的最短路径,该方法只能算无权最短路径

2、Dijkstra算法(解决单源最短路径)

最短路径问题—Dijkstra算法详解
Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,选择性的找到最优的松弛路线。注意该算法要求图中不存在负权边!
Dijkstra算法时间复杂度分析

存在改写版本解决负权边问题:找到最小负权边,在每次处理边时都加上该最小边的绝对值来使所有边成为非负边,再利用Dijkstra算法求出放缩后的最小路径,中间需要记住每个端点的最小路径中间有多少条边,在最后利用这个减去放缩的值获取原来的最小路径值。若存在负权圈,需要设置条件避免死循环。

3、Floyd算法(解决多源最短路径,解决负权边)

最短路径问题—Floyd算法详解
最短路径模板+解析——(FLoyd算法)
弗洛伊德算法是解决多源最短路径的一种算法,可以正确处理有向图或有向图或负权(但不可存在总权为负的回路)的最短路径问题,同时也被用于计算有向图的传递闭包。Floyd算法的时间复杂度为O(N3),空间复杂度为O(N2)

4、Bellman-Ford算法(解决负权边,解决单源最短路径)

深入理解Bellman-Ford(SPFA)算法
Bellman-ford(解决负权边)
Bellman-Ford算法是从DJ算法引申出来的,不同的是该算法对所有边遍历地不断松弛,遍历V遍。而不是走选择性的松弛路线。
它可以解决带有负权边的最短路径问题,值得注意的是,Bellman-Ford算法是基于邻接表,从边的角度考量的,ford算法只能用邻接表实现。此外,Bellman-Ford算法可以检测一个图是否含有负权回路。

5、SPFA算法

最短路径问题—SPFA算法详解
SPFA(Shortest Path Faster Algorithm)算法是求单源最短路径的一种算法,它是Bellman-ford的队列优化,它是一种十分高效的最短路算法。
很多时候,给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便派上用场了。SPFA的复杂度大约是O(kE),k是每个点的平均进队次数(一般的,k是一个常数,在稀疏图中小于2)
但是,SPFA算法稳定性较差,在稠密图中SPFA算法时间复杂度会退化。此外,SPFA算法还可以判断图中是否有负权环,即一个点入队次数超过N。

6、总结

图的最短路径:Dijkstra、Bellman-Ford、SPFA、Floyd、A*算法
适用情况
dj和ford算法用于解决单源最短路径,而floyd算法解决多源最短路径。
dj适用稠密图(邻接矩阵),因为稠密图问题与顶点关系密切;
ford算法适用稀疏图(邻接表),因为稀疏图问题与边关系密切。
floyd在稠密图(邻接矩阵)和稀疏图(邻接表)中都可以使用;
PS:dj算法虽然一般用邻接矩阵实现,但也可以用邻接表实现,只不过比较繁琐。而ford算法只能用邻接表实现。
dj算法不能解决含有负权边的图;
而Floyd算法和Ford算法可以解决含有负权边的问题,但都要求没有总和小于0的负权环路。
SPFA算法可以解决负权边的问题,而且复杂度比Ford低。形式上,它可以看做是dj算法和BFS算法的结合。
3种算法都是既能处理无向图问题,也能处理有向图问题。因为无向图只是有向图的特例,它们只是在邻接矩阵或邻接表的初始化时有所区别。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值