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