最短路——Dijskra算法学习

本文介绍了迪杰斯特拉算法的基础知识,包括优先队列的使用、链式前向星存储边的方法,以及算法的核心思想。通过建立图的模型解决非图论问题,并提供洛谷相关例题的解析,最后给出LeetCode相关作业题。

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

1.优先队列

重点关注优先队列升序和降序的定义:

priority_queue<int, vector<int>, greater<int> > q;//顶点最小
priority_queue<int, vector<int>, less<int> > q;//顶点最大
priority_queue<int> q;//默认为大根堆

如果优先队列参数为pair,依据pair的第一个参数进行排序:

#define pii pair<int, int>
priority_queue<pii> q;//默认为pair第一个int大根堆

优先队列内置函数参考队列即可。
单次运行时间复杂度为 O ( log ⁡ n ) O(\log n) O(logn)

2.链式前向星存边

对于这样一条有向边: x → y = z x\rightarrow y = z xy=z
我们通过链式前向星的方式存储:

int cnt = 0;
struct node {
   
	int to, nxt, val;
} edges[mx<<1];
void insert(int x, int y, int z) {
   
	++cnt;
	edges[cnt].to = y;
	edges[cnt].val = z;
	edges[cnt].nxt = head[x]; head[x] = cnt;
}

3.Dijskra算法思想

d i s x , d i s y dis_x,dis_y disx,disy分别表示起点 s s s到点 x , y x,y x,y当前的最短路径,若存在一条边: x → y = z x\rightarrow y =z xy=z
显然存在状态转移方程:
d i s

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值