最短路问题(Dijkstra/Floyd)

本文详细介绍了最短路问题,包括单源最短路Dijkstra算法和多源最短路Floyd算法。Dijkstra算法基于贪心思想,适用于无负边的图,通过逐步遍历更新最短路径。Floyd算法则利用传递闭包性质,通过三重循环寻找任意两点间的最短路径,但不适合处理大数据集。

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

最短路问题就是求 【一个点到另一个点的最短路径】
分为单源最短路(一个点到各个点之间的距离)和多源最短路(任意两点之间的距离)

1.Dijkstra算法

  • 使用广度优先搜索,解决【赋权有向图】或【无向图的单源最短路径】问题,不能出现负边
  • 基于【贪心】思想

1.1 内容

// 用 d i s [ ] dis[] dis[]数组储存从顶点到其他点的路径,通过一步步遍历比较,不断更新(保留最小的,改变较大的),最后得到dis即为所求

求从v1到各个点的最短路:
在这里插入图片描述
step1:初始化dis
在这里插入图片描述
step2:找最小的,固定,从这个点往外遍历
此时,离起点最近的那个点一定是最短的,因为没有负边,不可能经过其他的点了
① v3最小,意思是从v1到v3的所有路径中,一定是现在的最短,所以把<v1,v3>确定下来了
② 从v3开始遍历,发现v4,v4没有被遍历过,比较<v1,v3,v4>(经过v3到达)和<v1,v4>(由顶点直接到达)的最短距离(松弛操作),更新v4
在这里插入图片描述
step3:找最小的,固定
(重复step2中的思想往下做就行啦)

不断取出离顶点最近,并且没有被访问过的点

① v5最小,固定
② 遍历v5,发现<v5,v4>和<v5,v6>,比较<v1,v5,v4><v1,v4>和<v1,v5,v6><v1,v6>(顶点直接到达的和经过v5到达的)更新
在这里插入图片描述
step4:v4最小,固定,遍历v4发现v6,比较<v1,v6>和<v1,v4,v6><v1,v5,v6>,更新
在这里插入图片描述

在这里插入图片描述

1.2 堆优化

时间复杂度为

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值