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

关于SPFA

-它死了

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

于是我就决定学习Dijkstra

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

详细解析都在代码里。

下面附上代码

 //2019.08.14 XYYXP第一次写dijkstra最短路算法 于中山纪念中学
//模板题:Luogu P3371,P4779
#include <cstdio>
#include <queue>
#include <algorithm>
#define rr register
using namespace std;
const int inf = ;
int n,m,s,head[],tot,dis[],used[];
//定义全局变量和最大值(inf)
struct Edge{
int nxt,to,length;
}edge[];
//用结构体存边,nxt表示这条边起点连着的上一条边,to表示这条边通往哪个点,length表示边权
struct state {
int val, pos; bool operator < (const state &tmp) const
{
return val > tmp.val;
}
//重载运算符(重载小于号成大于号,用于大根堆变小根堆)
};
//定义一个结构体存点,pos表示当前点编号,val表示当前点到起点的最短路长度
state makestate(int _pos,int _val)
{
state tmp;
tmp.pos=_pos;
tmp.val=_val;
return tmp;
}
//一个结构体函数,新建一个state类型的结构体
void add(int x,int y,int z)
{
tot++;
edge[tot].to=y;
edge[tot].nxt=head[x];
edge[tot].length=z;
head[x]=tot;
}
//加边函数,表示x到y之间有一条权值为z的边
priority_queue <state> heap;
//新建一个优先队列(STL库函数)
void dijkstra(int st)
{
for(rr int i=;i<=n;i++)
dis[i]=inf;
//初始化起点到各个点的最短路为inf
dis[st]=;
heap.push(makestate(st,dis[st]));
//初始化起点,起点入队
while(!heap.empty())
{
int u = heap.top().pos;
heap.pop();
//取出优先队列中最小的点,用来更新最短路
if(used[u])
continue;
used[u]=true;
//判断和标记当前点是否被已经用来更新过
for(rr int i=head[u];i;i=edge[i].nxt)
{
int &v=edge[i].to;
//引用 v=edge[i].to;
if(dis[v] > dis[u]+edge[i].length)
{
dis[v] = dis[u]+edge[i].length;
//更新最短路
heap.push(makestate(v,dis[v]));
//将更新完的最短路入队
}
}
}
} int main()
{
int x,y,z;
scanf("%d %d %d",&n,&m,&s);
for(rr int i=;i<=m;i++)
{
scanf("%d %d %d",&x,&y,&z);
add(x,y,z);
}
//读入并建边
dijkstra(s);
//调用dijkstra算法函数求单源最短路
for(rr int i=;i<=n;i++)
printf("%d ",dis[i]);
//输出起点到各点的最短路
}

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. Codeforces 785 E. Anton and Permutation(分块,树状数组)

    Codeforces 785 E. Anton and Permutation 题目大意:给出n,q.n代表有一个元素从1到n的数组(对应索引1~n),q表示有q个查询.每次查询给出两个数l,r,要求 ...

  2. CentOS7 安装JumpServer

    环境: CentOS Linux release 7.6.1810 (Core) JumpServer 1.4.8 Python 3.6.X MariaDB 编译安装Python3.6 首先,下载Py ...

  3. 流程控制(判断if switch)

    判断语句 判断条件比特别多大 时候用switch 其他时候if语句比较方便   1.if……else a) if(判断条件) {执行语句:}   b) else if (判断语句){执行语句:}   ...

  4. Android学习_服务

    一.           服务1.         Android多线程 每一个Android应用程序都会分别运行在一个独立的Dalvik(或ART?)虚拟机中,而每个虚拟机在启动时会运行一个UI主线 ...

  5. Yum:[Errno 5] [Errno 2] No such file or directory

    出现这样的问题,就是因为之前python2升级到python3之后,yum有些配置文件定位不到之前的python2了,所以这里需要改掉两个配置文件就不会出事了. yum安装软件时,可以连接yum 仓库 ...

  6. 简单的多屏播放器示例(vlc+qt)

      介绍 简单的多屏播放器 最多同时播放16个视频 支持本地文件和rtsp.rtmp等流媒体播放 VS2015工程,依赖Qt+VLC 练手作品 截图 下载 程序:download.csdn.net/d ...

  7. tomcat8踩坑:url包含|等特殊字符报错400的问题

    这个问题纠缠了我很久了,终于在今天早上解决了,感谢自己的不放弃和不断尝试的决心,我坚信,我可以找到解决方式!! 项目用的spring boot+spring security框架,关于统一错误页面在开 ...

  8. [Ajax三级联动 无刷新]

    三级联动 的效果图 html页面: <body> <label class="fl">区域:</label> <select class= ...

  9. oracle设置默认值无效

    一次做农行的项目,在向一个表插入数据时我们要求插入字符类型的操作日期和时间,我们这边当时采取的是给日期和时间字段设置默认值的方法:下面我简单还原一下当时的表结构 -- Create table cre ...

  10. 【经验】PHP开发中 &#65279 导致页头一行空白

    PHHP开发中  有的时候遇到页面顶部多出一行空白,审查元素发现头部有一行  比如在$this->dispay();方法中最前面加入ob_clean();   ================ ...