dijkstra算法优先队列
2024-08-21 09:31:50
d[i] 是起点到 I 节点的最短距离
void Dijkstra(int s) {
priority_queue<P, vector<P>, greater<P> > que;
fill(d, d + MAXN, INF);
d[s] = 0;
que.push(make_pair(0, s)); //first:d[i] second:i
while (!que.empty()) {
P p = que.top(); que.pop();
int v = p.second;
if(d[v] < p.first) continue; //如下图 //d[v] < p.first 说明,v 点已经通过其他路径变得松弛,距离更短。而 p.first 只是之前入队的旧元素
for (int i = 0; i < G[v].size(); i++) {
edge e = edges[G[v][i]];
if (d[e.to] > d[v] + e.cost) {
d[e.to] = d[v] + e.cost;
que.push(P(d[e.to], e.to));
}
}
}
}
if(d[v] < p.first) continue;
解释:以 1 为起点,第一次遍历会将2,3,5(I) 全部加入队列。然后出队3,然后4,然后更新5, 5(II)又入队,5(II)没有出度,然后5(II)出队,接着第一轮的 5(I) 出队,但是此时 5(I) 已经不是这个点已经不满足最短路径存在定理,所以不能再更新和5相关联的边,应该直接让其出队。也就是这个判断条件
如果不使用这个判断,也可以开一个 vis 数组,用来标记,只要是更新过的节点就不能再次更新周围的节点。
最新文章
- 10年微软MVP路(如何成为一个MVP?)
- jquery之replaceAll(),replaceWith()方法详解
- 搭建spring的开发环境
- 李洪强-C语言关键字、标识符和注释
- HDFS的java操作方式
- Part 11 string functions in sql server
- C语言 格式说明符
- 使用SQLPLUS创建用户名和表空间
- python_如何派生内置不可变类型并修改实例化行为
- 详解URL的组成
- 【腾讯Bugly干货分享】WebSocket 浅析
- Centos7中ss命令安装
- (4)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- Consul服务发现和消费
- c++中string类对象和字符数组之间的相互转换
- ####### Scripts Summary #######
- PO VO BO DTO POJO DAO之间的关系
- linux命令之vi文本编辑器
- 【BZOJ-3218】a+b Problem 最小割 + 可持久化线段树
- Hibernate注解方式一对多自关联关系映射
- Android 应用安装