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 数组,用来标记,只要是更新过的节点就不能再次更新周围的节点。

最新文章

  1. 10年微软MVP路(如何成为一个MVP?)
  2. jquery之replaceAll(),replaceWith()方法详解
  3. 搭建spring的开发环境
  4. 李洪强-C语言关键字、标识符和注释
  5. HDFS的java操作方式
  6. Part 11 string functions in sql server
  7. C语言 格式说明符
  8. 使用SQLPLUS创建用户名和表空间
  9. python_如何派生内置不可变类型并修改实例化行为
  10. 详解URL的组成
  11. 【腾讯Bugly干货分享】WebSocket 浅析
  12. Centos7中ss命令安装
  13. (4)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- Consul服务发现和消费
  14. c++中string类对象和字符数组之间的相互转换
  15. ####### Scripts Summary #######
  16. PO VO BO DTO POJO DAO之间的关系
  17. linux命令之vi文本编辑器
  18. 【BZOJ-3218】a+b Problem 最小割 + 可持久化线段树
  19. Hibernate注解方式一对多自关联关系映射
  20. Android 应用安装

热门文章

  1. Navicat连接MySQL数据库的一些问题与解决方案
  2. URAL 2080 Wallet
  3. windows 7 elasticsearch-5.3.2
  4. Eventlet Greenlet
  5. kill 与 kill -9(面试中问道的知识点)
  6. Docker | 第七章:Docker Compose服务编排介绍及使用
  7. Docker | 第零章:前言
  8. 北航oo作业第四单元小结
  9. java关于类的构建
  10. JAVA 面试重点知识个人总结