【最短路】迪杰斯特拉算法(朴素法以及堆+邻接表优化版)

这篇博客详细介绍了Dijkstra求最短路算法的基本思想和应用,包括初始状态设置、循环寻找最短路径的过程。同时,提供了两种实现方式:一种是基于矩阵的简单实现,另一种是利用优先队列进行优化的实现,通过邻接表减少时间复杂度。文章还讨论了为何可以如此更新节点的最短距离,并指出堆优化可以提高算法效率。

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

题目

 活动 - AcWing

解释

AcWing 849. Dijkstra求最短路 I - AcWing

  • g[i][j]代表i到j的距离
  • 用上界0x3f3f3f3f(在memset里可以用0x3f来替代)初始化没有边的两个结点
  • 执行n-1次循环,每次确定一个点到1号结点的最短距离
  • 每次循环中查找没有确定最短距离的结点中离1号结点距离最近的那个结点dist[t]
  • 然后比较这些没有确定最短距离的结点的当前dist和dist[t]+g[t][i]的大小
  • 为什么可以这么做需要查找具体的迪杰斯特拉算法数学证明
  • 最外层for循环执行n-1次是因为,最后一个结点可能要经过n-1个结点才是最短距离
  • 也可以理解成每执行一次确定一个结点的最短距离,这样至少确定完n-1个结点的最短距离
  • 此时第n个结点的最短距离也就出来了

代码段

#include<bits/stdc++.h>
using namespace std;
int n,m;
const int N=510;
int g[N][N];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nathan Qian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值