[Data Structure & Algorithm] 带权有向图的最短路径

本文深入探讨了Dijkstra算法和Floyd算法,两种经典的最短路径寻找方法。Dijkstra算法适用于从一个源点找到到图中其他所有点的最短路径,而Floyd算法则能找出图中任意两点间的最短路径。文章详细介绍了这两种算法的基本思路、具体实现步骤及时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最短路径 - 从顶点A(源点)到顶点B(终点),权值最小的路径

Dijkstra算法 - 一个源点与其他点之间的最短路径

  • 基本思路 - 设 图中的顶点集为V; 最短路径已确定的顶点集为S
    1.将源点添加到S中
    2.计算出每个顶点的估计距离 - 除了终点在V-S中,其余路径中的点都在S中
    3.把最小估计距离所连接的顶点放入S中,此时可能会改变顶点的估计距离
    4.重复2、3,直到所有顶点都在S中,得到源点到其他所有顶点的最小路径,即最小的估计距离
  • 具体实现
    • 引入数组D
      • 长度 - 顶点数-1
      • D[vj] - 从源点到顶点vj的估计距离
      • 初始化数组 - 对于和源点不是直接相连的点vi,D[vi] = 10000(设置一个大于所有权值相加的值)
    • 如果估计距离变小,则更新对应的D中的值
  • 时间复杂度 - O(n2) (邻接表和邻接矩阵相同)

Floyd算法 - 所有点对之间的最短路径

  • 基本思路
    1.把所有点对之间的直接路径权值保存在矩阵中,没有直接路径的记为∞
    2.依次扫描每个点,扫描过的点可以作为中间点,查看增加中间点后, 是否有更小的路径,如果有,更新矩阵中的值
  • 时间复杂度 - O(n3)

转载于:https://www.cnblogs.com/break-dawnn/p/9736546.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值