图的最短路径算法

最短路径问题是图论研究中的一个经典算法问题,旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。算法具体的形式包括:

  1. 确定起点的最短路径问题 - 即已知起始结点,求最短路径的问题。适合使用Dijkstra算法。

  2. 确定终点的最短路径问题 - 与确定起点的问题相反,该问题是已知终结结点,求最短路径的问题。在无向图中该问题与确定起点的问题完全等同,在有向图中该问题等同于把所有路径方向反转的确定起点的问题。

  3. 确定起点终点的最短路径问题 - 即已知起点和终点,求两结点之间的最短路径。

  4. 全局最短路径问题 - 求图中所有的最短路径。适合使用Floyd-Warshall算法。

Dijkstra算法

前三种问题使用Dijkstra算法来求解效率都不错。

Dijkstra算法的具体实现方法为:

  1. 设置两个顶点的集合T和S:

    a) S中存放已找到最短路径的顶点,初始时,集合S中只有一个顶点,即源点v0;

    b) T中存放当前还未找到最短路径的顶点;

  2. 在T集合中选取当前长度最短的一条最短路径(v0,…,vk),从而将vk加入到顶点集合S中,并修改源点v0到T中各顶点的最短路径长度;重复这一步骤,直到所有的顶点都加入到集合S中,算法就结束了。

时间复杂度: O(n2)
视频参考: 屈老师的算法视频

Floyd算法

Floyd算法是一种求全局最短路径的一种算法,这个算法采用动态规划的思想,d(k)[i, j]表示i到j之间的路径经过最大的节点数不超过k的最短长度,
递推方程: d(k)[i,j]=min{d(k1)[i,j],d(k1)[i,k]+d(k1)[k,j]}
最终结果就是 d(n)[i,j]
时间复杂度为 O(n3)

视频示例

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值