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 x→y=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 x→y=z
显然存在状态转移方程:
d i s y = min { d i s x + z } dis_y = \min\{dis_x+z\} dis

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

被折叠的 条评论
为什么被折叠?



