Dijkstra是我学会的第一个最短路算法,为什么不先去学SPFA呢?因为我在luogu上翻到了一张比较神奇的图:

关于SPFA

-它死了

以及网上还有各位大佬的经验告诉我:SPFA这玩意很容易被卡。

于是我就决定学习Dijkstra

结构体存边(链式前向星)+优先队列(堆)+Dijkstra求最短路

详细解析都在代码里。

下面附上代码

  1. //2019.08.14 XYYXP第一次写dijkstra最短路算法 于中山纪念中学
  2. //模板题:Luogu P3371,P4779
  3. #include <cstdio>
  4. #include <queue>
  5. #include <algorithm>
  6. #define rr register
  7. using namespace std;
  8. const int inf = ;
  9. int n,m,s,head[],tot,dis[],used[];
  10. //定义全局变量和最大值(inf)
  11. struct Edge{
  12. int nxt,to,length;
  13. }edge[];
  14. //用结构体存边,nxt表示这条边起点连着的上一条边,to表示这条边通往哪个点,length表示边权
  15. struct state {
  16. int val, pos;
  17.  
  18. bool operator < (const state &tmp) const
  19. {
  20. return val > tmp.val;
  21. }
  22. //重载运算符(重载小于号成大于号,用于大根堆变小根堆)
  23. };
  24. //定义一个结构体存点,pos表示当前点编号,val表示当前点到起点的最短路长度
  25. state makestate(int _pos,int _val)
  26. {
  27. state tmp;
  28. tmp.pos=_pos;
  29. tmp.val=_val;
  30. return tmp;
  31. }
  32. //一个结构体函数,新建一个state类型的结构体
  33. void add(int x,int y,int z)
  34. {
  35. tot++;
  36. edge[tot].to=y;
  37. edge[tot].nxt=head[x];
  38. edge[tot].length=z;
  39. head[x]=tot;
  40. }
  41. //加边函数,表示x到y之间有一条权值为z的边
  42. priority_queue <state> heap;
  43. //新建一个优先队列(STL库函数)
  44. void dijkstra(int st)
  45. {
  46. for(rr int i=;i<=n;i++)
  47. dis[i]=inf;
  48. //初始化起点到各个点的最短路为inf
  49. dis[st]=;
  50. heap.push(makestate(st,dis[st]));
  51. //初始化起点,起点入队
  52. while(!heap.empty())
  53. {
  54. int u = heap.top().pos;
  55. heap.pop();
  56. //取出优先队列中最小的点,用来更新最短路
  57. if(used[u])
  58. continue;
  59. used[u]=true;
  60. //判断和标记当前点是否被已经用来更新过
  61. for(rr int i=head[u];i;i=edge[i].nxt)
  62. {
  63. int &v=edge[i].to;
  64. //引用 v=edge[i].to;
  65. if(dis[v] > dis[u]+edge[i].length)
  66. {
  67. dis[v] = dis[u]+edge[i].length;
  68. //更新最短路
  69. heap.push(makestate(v,dis[v]));
  70. //将更新完的最短路入队
  71. }
  72. }
  73. }
  74. }
  75.  
  76. int main()
  77. {
  78. int x,y,z;
  79. scanf("%d %d %d",&n,&m,&s);
  80. for(rr int i=;i<=m;i++)
  81. {
  82. scanf("%d %d %d",&x,&y,&z);
  83. add(x,y,z);
  84. }
  85. //读入并建边
  86. dijkstra(s);
  87. //调用dijkstra算法函数求单源最短路
  88. for(rr int i=;i<=n;i++)
  89. printf("%d ",dis[i]);
  90. //输出起点到各点的最短路
  91. }

The End

2019中山纪念中学夏令营-Day14 图论初步【dijkstra算法求最短路】的更多相关文章

  1. 2019中山纪念中学夏令营-Day19 数论初步【GCD(最大公约数),素数相关】

    关于GCD的一些定理或运用的学习: 1. 2.二进制算法求GCD 思想:使得最后的GCD没有2(提前把2提出来) 代码实现: #include <cstdio> #define int l ...

  2. 2019中山纪念中学夏令营-Day21[JZOJ]

    2019中山纪念中学夏令营-Day21[JZOJ] 提高组(B组模拟赛)Team_B (由于本人太弱,并没有订正完题目) (题解大部分是从官方题解文件上摘来的) 日常膜拜大神:じやゆん蒟蒻 正文部分: ...

  3. 2019中山纪念中学夏令营-Day20[JZOJ] T1旅游详解

    2019中山纪念中学夏令营-Day20[JZOJ] 提高组B组 Team_B组 T1 旅游 Time Limits: 2000 ms  Memory Limits: 262144 KB Descrip ...

  4. 2019中山纪念中学夏令营-Day9[JZOJ](第六次模拟赛)

    Begin (题目的排序方式:Unkown其实是按心情排的) 异或:(摘自百度百科) 异或(xor)是一个数学运算符.它应用于逻辑运算.异或的数学符号为“⊕”,计算机符号为“xor”.其运算法则为: ...

  5. 2019中山纪念中学夏令营-Day12[JZOJ]

    Begin (题目的排序方式:题号) 每期新姿势:(今天推荐一位巨佬)Cefola-Kiroxs 推荐知识:namespace的用法(本赛我的代码中将用到) 2019.08.12[NOIP普及组]模拟 ...

  6. 2019中山纪念中学夏令营-Day4[JZOJ]

    Begin (题目的排序方式:难易程度) 什么是对拍: 对拍是一种在写完程序后,验证自己程序是不是正解的比较方便的方法. 实现过程: 对同一道题,再打一个暴力程序,然后用一些大数据等跑暴力程序来进行验 ...

  7. 2019中山纪念中学夏令营-Day2[JZOJ]

    博客的开始,先聊聊代码实现: 每次比赛以后,要有归纳错误的习惯. 错误小结: 1.读入:scanf(“%c”)会读入回车和空格,但cin不会. 2.对于二维数组的输入,不能把m,n搞混了,会引起严重的 ...

  8. 2019中山纪念中学夏令营-Day1[JZOJ]

    T1 题目描述: 1999. Wexley接苹果(apple) (File IO): input:apple.in output:apple.out 时间限制: 1000 ms  空间限制: 1280 ...

  9. [小结] 中山纪念中学2018暑期训练小结(划掉)(颓废记)-Day10

    [小结] 中山纪念中学2018暑期训练小结(划掉)(颓废记)-Day10 各位看众朋友们,你们好,今天是2018年08月14日,星期二,农历七月初四,欢迎阅看今天的颓废联编节目 最近发生的灵异事件有 ...

随机推荐

  1. Vue_(组件)实例属性

    Vue实例属性与方法中文文档 传送门   Vue实例属性:vue实例直接调用的属性 Learn 一.vm.$data:获取属性 二.vm.$el:获取实例挂载的元素 三.vm.$options:获取自 ...

  2. Android_(控件)使用ListView显示Android系统SD卡的文件列表_02

    使用ListView显示Android SD卡中的文件列表 父类布局activity_main.xml,子类布局item_filelayout(一个文件的单独存放) 运行截图: 程序结构 <?x ...

  3. [CSP-S模拟测试]:走路(期望DP+分治消元)

    题目传送门(内部题100) 输入格式 第一行两个整数$n,m$,接下来$m$行每行两个整数$u,v$表示一条$u$连向$v$的边.不保证没有重边和自环. 输出格式 $n-1$行每行一个整数,第$i$行 ...

  4. $\LaTeX$数学公式大全5

    $5\ Variable-sized\ symbols(displayed\ formulae\ show\ larger\ version)$$\sum$ \sum$\prod$ \prod$\co ...

  5. java拦截器获取请求完整参数

    public class OptLogAspect implements HandlerInterceptor { @Override public boolean preHandle(HttpSer ...

  6. SQL编写自定义函数

    -- 通过一个子级ID 返回一级分类名称alter function calcclass(@dclassid as int)returns varchar(50)asbegin-- 通过一个子级ID ...

  7. C++中的各种容器实现原理

    C++ 容器及选用总结 vector 拥有一段连续的内存空间 list 就是数据结构中的双向链表 deque 的动态数组首尾都开放 set 有序的容器,红黑树的平衡二叉检索树的数据结构 multise ...

  8. 菜鸟的周末_Python试水

    搭建开发环境 下载安装包,打开官网,选择最新Windows Installer版本下载. 运行安装包,勾选Add Python 3.8 to Path,选择Install Now,等待安装完成,直接关 ...

  9. 前端使用 fabric 进行部署

    概述 前端打包完成之后需要上传到服务器,怎么上传呢?可以先上传到 github,然后在远程服务器上面拉取,最后打包上线.但是这样很麻烦,使用 fabric 可以很简单的一键部署.我根据自己的使用经验, ...

  10. 阶段3 3.SpringMVC·_04.SpringMVC返回值类型及响应数据类型_4 响应之返回值是ModelAndView类型

    ModelAndView是SpringMvc提供的一个对象 ModelAndView底层源码用也是ModelMap.ModelMap实现过Model的接口 ModelAndView可以直接new出来. ...