2019中山纪念中学夏令营-Day14 图论初步【dijkstra算法求最短路】
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算法求最短路】的更多相关文章
- 2019中山纪念中学夏令营-Day19 数论初步【GCD(最大公约数),素数相关】
关于GCD的一些定理或运用的学习: 1. 2.二进制算法求GCD 思想:使得最后的GCD没有2(提前把2提出来) 代码实现: #include <cstdio> #define int l ...
- 2019中山纪念中学夏令营-Day21[JZOJ]
2019中山纪念中学夏令营-Day21[JZOJ] 提高组(B组模拟赛)Team_B (由于本人太弱,并没有订正完题目) (题解大部分是从官方题解文件上摘来的) 日常膜拜大神:じやゆん蒟蒻 正文部分: ...
- 2019中山纪念中学夏令营-Day20[JZOJ] T1旅游详解
2019中山纪念中学夏令营-Day20[JZOJ] 提高组B组 Team_B组 T1 旅游 Time Limits: 2000 ms Memory Limits: 262144 KB Descrip ...
- 2019中山纪念中学夏令营-Day9[JZOJ](第六次模拟赛)
Begin (题目的排序方式:Unkown其实是按心情排的) 异或:(摘自百度百科) 异或(xor)是一个数学运算符.它应用于逻辑运算.异或的数学符号为“⊕”,计算机符号为“xor”.其运算法则为: ...
- 2019中山纪念中学夏令营-Day12[JZOJ]
Begin (题目的排序方式:题号) 每期新姿势:(今天推荐一位巨佬)Cefola-Kiroxs 推荐知识:namespace的用法(本赛我的代码中将用到) 2019.08.12[NOIP普及组]模拟 ...
- 2019中山纪念中学夏令营-Day4[JZOJ]
Begin (题目的排序方式:难易程度) 什么是对拍: 对拍是一种在写完程序后,验证自己程序是不是正解的比较方便的方法. 实现过程: 对同一道题,再打一个暴力程序,然后用一些大数据等跑暴力程序来进行验 ...
- 2019中山纪念中学夏令营-Day2[JZOJ]
博客的开始,先聊聊代码实现: 每次比赛以后,要有归纳错误的习惯. 错误小结: 1.读入:scanf(“%c”)会读入回车和空格,但cin不会. 2.对于二维数组的输入,不能把m,n搞混了,会引起严重的 ...
- 2019中山纪念中学夏令营-Day1[JZOJ]
T1 题目描述: 1999. Wexley接苹果(apple) (File IO): input:apple.in output:apple.out 时间限制: 1000 ms 空间限制: 1280 ...
- [小结] 中山纪念中学2018暑期训练小结(划掉)(颓废记)-Day10
[小结] 中山纪念中学2018暑期训练小结(划掉)(颓废记)-Day10 各位看众朋友们,你们好,今天是2018年08月14日,星期二,农历七月初四,欢迎阅看今天的颓废联编节目 最近发生的灵异事件有 ...
随机推荐
- Codeforces 981 D.Bookshelves(数位DP)
Codeforces 981 D.Bookshelves 题目大意: 给n个数,将这n个数分为k段,(n,k<=50)分别对每一段求和,再将每个求和的结果做与运算(&).求最终结果的最大 ...
- Codeforces 979 D. Kuro and GCD and XOR and SUM(异或和,01字典树)
Codeforces 979 D. Kuro and GCD and XOR and SUM 题目大意:有两种操作:①给一个数v,加入数组a中②给出三个数x,k,s:从当前数组a中找出一个数u满足 u ...
- find命令不递归查询子目录
[root@dbrg-2 test]# find . ! -name "." -type d -prune -o -type f -name "*.jpg" ...
- websocket聊天体验(二)
上一篇说到后续可以支持:最近历史.表情+图片,顺便还实现了简易的音频和视频.暂时没有实现实时语音对讲,有待后续再研究.点开在线聊天页面,即可看到最近历史记录(18条). 聊天的底层数据都是基于txt文 ...
- python3笔记二十三:正则表达式之元字符
一:学习内容 匹配单个字符与数字:..[].^.\d.\D.\w.\W.\s.\S 匹配锚字符(边界字符):^.$.\A.\Z.\b.\B 匹配多个字符:(xyz) .x?.x*..*.x+.x{n} ...
- 2.1 MATLAB的数据类型
2.1 MATLAB的数据类型 每种数据类型都是以矩阵的形式存在的 数据类型:数值型.字符型.元胞型.结构体.函数句柄 数值型包含:双精度类型.单精度类型.整型 支持不同数据的转换 2.1.1 变量与 ...
- 黑马vue---14、v-model双向绑定
黑马vue---14.v-model双向绑定 一.总结 一句话总结: 1.v-bind 只能实现数据的单向绑定,从 M 自动绑定到 V, 无法实现数据的双向绑定 2.v-model 指令,可以实现 表 ...
- 前世今生:Hive、Shark、spark SQL
Hive (http://en.wikipedia.org/wiki/Apache_Hive )(非严格的原文顺序翻译) Apache Hive是一个构建在Hadoop上的数据仓库框架,它提供数据的 ...
- 【原】vue-router中params和query的区别
1.引入方式不同 query要用path来引入 this.$router.push({ path: 'test', query: { type: 2, detail: '哈哈' } }) params ...
- Linux之bzip2命令
命令格式: bzip2 [-cdz] 档名 参数: -d :解压缩的参数 -z :压缩的参数 -num 用指定的数字num调整压缩的速度,-1或--fast表示最快压缩方法(低压缩比),-9或--be ...