单源最短路径--Dijkstra

本文介绍了Dijkstra算法用于求解单源最短路径的问题,详细阐述了其主要思想、实现方法以及优化策略。通过使用优先队列进行堆优化,减少重复计算。同时,文章提醒在处理无向图时需要双向加边。最后,提供了模板题目链接供读者实践。

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

Dijkstra的用途:

  • Dijkstra是一个求单源最短路径的算法。

  • "单源最短路径",顾名思义,从一个源头到其他结点的最短路径。而这个算法,可以求出单个点对其他所有点的最短路径长度。(有些情况是Dijkstra不能处理的,比如负边权,遇到这类情况可能就需要使用其他算法了)

 
Dijkstra的思想:

  • 主要思想:

  • 从源结点开始,遍历源结点的所有连接的边,并进行排序,再从边的值最小的一个边开始遍历,在每一次遍历的过程中,都尝试更新所储存的某个结点对于源结点的最短路径长度(假设我们要到点B,目前我们遍历到了点A,如果点A到点B的距离加上点A到源点的距离比目前我们之前存储的 源点到点B的距离短的话,就更新源点到点B的最短路径,并在之后遍历连着点B的点(也就是进行BFS))。

  • 例子:

  • 首先,从源结点开始进行BFS(也就是遍历到达的点所向外连着的点.比如A->B B->A A->C(A连B,B连A,A连C),那么BFS A结点就是B C)

  • 在BFS的过程中,每到一个点,就比较一下从 源头到这个点的路径长度 和 之前求的从源头到这个点的最短路径的长度 大小,如果现在这个路径长度比较小,就存起来

Dijkstra的实现方法:

  • 首先,存图(使用邻接表或链式前向星(如果不会存图建议先学存图,因为这里不会讲怎么存图和BFS)).
  • 算法运行过程:
  1. 把数据(也就是dis数组)初始化为INF(为什么要这样做?这是因为我们要使用较小的值不停更新它,这样最终就是源点到这个点的最小值了。那怎么知道某个点所对应的与源点的距离呢?一般是把源点的序号当做数组的下标。下标是什么意思呢?比如使用这个代码:int i=A[10],10就是数组A的一个下标。源点的序号是什么意思呢?一般使用源点读入的顺序当做源点的序号)
  2. 准备一个优先队列,用于之后进行的BFS.
  3. 在BFS
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值