1. // 再来一手精髓的Dijkstra
  2. // 复杂度O( E*log(V) )
  3.  
  4. #include <cstdio>
  5. #include <iostream>
  6. #include <vector>
  7. #include <queue>
  8.  
  9. using namespace std;
  10.  
  11. const int max_N = +;
  12. const int max_E = +;
  13. const int INF = 1e9;
  14.  
  15. int N,E;
  16. int d[max_N];
  17.  
  18. // 来自何方,已经不重要了。
  19. // 实际上是在邻接表实现的过程中,行号即为来自的顶点
  20. struct edge
  21. {
  22. int to,cost;
  23. };
  24. // P.first代表距离,P.second代表顶点编号
  25. typedef pair<int,int> P;
  26.  
  27. vector<edge> G[max_N];
  28.  
  29. // 这一个算法下来,我们在数组d中得到了从s点到其余所有顶点的最短路程
  30. void dijkstra(int s)
  31. {
  32. // 建立最堆,来维护最小距离,可以降低一层复杂度
  33. priority_queue< P,vector<P>,greater<P> > que;
  34.  
  35. fill(d,d+N,INF);
  36. d[s]=;
  37. que.push(P(,s));
  38.  
  39. while(!que.empty())
  40. {
  41. // 取出一个顶点,看是否是Dijstra算法中,已经确定的最小顶点
  42. P p=que.top();
  43. que.pop();
  44.  
  45. int v=p.second;
  46. // 让我们来看看这一步
  47. // 首先,每次取出堆中的最小元素
  48. // 然后去检索这个堆顶元素的标号所对应的距离
  49. // 咦,你会发现堆顶这个距离,竟然比取出的最小元素还要小
  50. // 惊讶?难道出错了?没有,考虑Dijkstra算法的流程,这个顶点肯定是之前已经确定过的最小顶点了,不需要考虑
  51. // 之前的实现是多加了一个flag数组来标记,这里可以省去这部分内存,直接用这个条件来判断
  52. if(d[v]<p.first)
  53. {
  54. continue;
  55. }
  56.  
  57. for(int i=;i<G[v].size();++i)
  58. {
  59. edge e=G[v][i];
  60. if(d[e.to] > d[v] + e.cost)
  61. {
  62. d[e.to]=d[v]+e.cost;
  63. // 数组中维护此次被更新的节点即可,其余节点不需要维护
  64. que.push(P(d[e.to],e.to));
  65. }
  66. }
  67. }
  68.  
  69. }
  70.  
  71. int main()
  72. {
  73. int a,b,c;
  74. scanf("%d %d",&N,&E);
  75. for(int i=;i<E;++i)
  76. {
  77. scanf("%d %d %d",&a,&b,&c);
  78. edge e;
  79. e.to=b;
  80. e.cost=c;
  81. G[a].push_back(e);
  82. // 无向图
  83. e.to=a;
  84. e.cost=c;
  85. G[b].push_back(e);
  86. }
  87.  
  88. dijkstra();
  89.  
  90. for(int i=;i<N;++i)
  91. {
  92. printf("%d ",d[i]);
  93. }
  94.  
  95. return ;
  96. }
  97.  
  98. /*
  99. 7 10
  100. 0 1 2
  101. 0 2 5
  102. 1 2 4
  103. 1 3 6
  104. 1 4 10
  105. 2 3 2
  106. 3 5 1
  107. 4 5 3
  108. 4 6 5
  109. 5 6 9
  110.  
  111. */

Dijkstra算法2的更多相关文章

  1. 求两点之间最短路径-Dijkstra算法

     Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.D ...

  2. Dijkstra算法优先队列实现与Bellman_Ford队列实现的理解

    /* Dijkstra算法用优先队列来实现,实现了每一条边最多遍历一次. 要知道,我们从队列头部找到的都是到 已经"建好树"的最短距离以及该节点编号, 并由该节点去更新 树根 到其 ...

  3. 关于dijkstra算法的一点理解

    最近在准备ccf,各种补算法,图的算法基本差不多看了一遍.今天看的是Dijkstra算法,这个算法有点难理解,如果不深入想的话想要搞明白还是不容易的.弄了一个晚自习,先看书大致明白了原理,就根据书上的 ...

  4. 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)

    关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...

  5. Dijkstra算法(二)之 C++详解

    本章是迪杰斯特拉算法的C++实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法图解 3. 迪杰斯特拉算法的代码说明 4. 迪杰斯特拉算法的源码 转载请注明出处:http://www.cnbl ...

  6. Dijkstra算法(一)之 C语言详解

    本章介绍迪杰斯特拉算法.和以往一样,本文会先对迪杰斯特拉算法的理论论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法 ...

  7. 最短路问题Dijkstra算法

    Dijkstra算法可以解决源点到任意点的最短距离并输出最短路径 准备: 建立一个距离数组d[ n ],记录每个点到源点的距离是多少 建立一个访问数组v[ n ],记录每个点是否被访问到 建立一个祖先 ...

  8. dijkstra算法求最短路

    艾兹格·W·迪科斯彻 (Edsger Wybe Dijkstra,1930年5月11日~2002年8月6日)荷兰人. 计算机科学家,毕业就职于荷兰Leiden大学,早年钻研物理及数学,而后转为计算学. ...

  9. 数据结构之Dijkstra算法

    基本思想 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算). 此外,引进两个集合S和U.S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求 ...

  10. ACM: HDU 1869 六度分离-Dijkstra算法

    HDU 1869六度分离 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Descri ...

随机推荐

  1. Isx个人第4次作业—Alpha项目测试

    标题 内容 这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/GeographicInformationScience 这个作业要求在哪里 https:// ...

  2. 如何从Serilog请求日志记录中排除健康检查终结点

    这是在ASP.NET Core 3.X中使用Serilog.AspNetCore系列文章的第四篇文章:. 第1部分-使用Serilog RequestLogging减少日志详细程度 第2部分-使用Se ...

  3. React 解析/ 第二节 使用 Reac

    官方脚手架 create-react-app React 提供了一个官方的命令行工具(CLI)—— create-react-app,是专门用于快速搭建单页面应用(SPA)的脚手架,它基于 Webpa ...

  4. 1759: 学生信息插入(武汉科技大学结构体oj)(已AC)

    #include<stdio.h>struct student { long no; char name[9]; int score;} t;void input(struct stude ...

  5. PE可执行文件加载器

    PE文件加载器 模仿操作系统,加载pe文件到内存中 该项目主要是为了检测pe的学习程度,是否都完全理解了.当然没有完全理解 实现功能的如下: 模仿操作系统,加载pe文件到内存中,然后执行待执行的pe文 ...

  6. OpenStack之虚拟机热迁移

    这里的环境是centos7版本,openstack K版 1.在各个计算节点设置权限 chmod /var/lib/nova/instances 2.修改各个节点的nova.conf(/etc/nov ...

  7. 使用html及CSS实现在table中文字信息超过5个隐藏,鼠标移到时弹窗显示全部:

    使用html及CSS实现在table中文字信息超过5个隐藏,鼠标移到时弹窗显示全部: <!DOCTYPE html><html lang="en">< ...

  8. 使用脚本+kafka自带命令行工具 统计数据写入kafka速率

    思路 每隔一段时间(比如说10秒)统计一次某topic的所有partition的最大offset值之和,这便是该topic的message总数. 然后除以间隔时间就可以粗略但方便得出 某topic的数 ...

  9. BZOJ 1046 [HAOI2007]上升序列(LIS + 贪心)

    题意: m次询问,问下标最小字典序的长度为x的LIS是什么 n<=10000, m<=1000 思路: 先nlogn求出f[i]为以a[i]开头的LIS长度 然后贪心即可,复杂度nm 我们 ...

  10. 一起了解 .Net Foundation 项目 No.2

    .Net 基金会中包含有很多优秀的项目,今天就和笔者一起了解一下其中的一些优秀作品吧. 中文介绍 中文介绍内容翻译自英文介绍,主要采用意译.如与原文存在出入,请以原文为准. ASP.NET MVC, ...