今天为大家介绍一下Dijkstra算法及其模板,并且解决蓝桥杯省赛出现的真题——路径 Dijkstra算法

⭐Dijkstra算法的基本思想是:每次找到里源点最近的一个顶点,然后以该顶点为中心进行扩展,最终得到雨点到其余所有点的最短路径。(dist[i]数组代表从源点到顶点i的最短路,st[i]用来标记该点是否已经被更新)
⭐基本步骤如下:
⭐1.将所有的顶点分为两部分:已知最短路程的顶点集合P和未知最短路径的顶点集合Q。最开始,已知最短路径的顶点集合P中只有源点一个顶点。我们这里用一个bool类型数组st[]来记录哪些点在集合P中。例如对于某个顶点i,如果st[i]为true则表示这个顶点在集合P中,如果st[i]为false则表示这个顶点在集合Q中。
⭐2.设置源点s到自己的最短路径为0即dist[1]=0, 若存在有源点能直接到达的项点1。则把dist[i]设为e[s][i]同时把所有其他(源点不能直接到达的)顶点的最短路径设为∞。
⭐3.在集合Q中的所有顶点中选择一个离源点s最近的顶点u(即dist[u]最小) 加入到集合P。并考察所有以点u为起点的边,对每一条边进行松弛操作。例如存在从u到v的一条边有dist[v]>dist[u]+e[u][v](即从源点直接到v的距离大于从源点先到u再从u到v的距离),我们可以用新值dist[u]+e[u][v]来替代当前dist[v]中的值。
⭐4.重复第3步,如果集合Q为空,算法结束。最终dist数组中的值就是源点到所有顶点的最短路径。

代码模板如下:

#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
int g[N][N];//用来存边
int dist[N];//记录每个点到源点的距离
bool st[N];//标记该点是否已更新
int n,m;
int pirm()
{memset(dist,0x3f,sizeof dist);dist[1]=0;for(int i=0;i<n;i++){int t=-1;for(int j=1;j<=n;j++)if(!st[i]&&(t==-1||dist[t]>dist[j]))t=j;st[t]=true;for(int j=1;j<=n;j++)dist[j]=min(dist[j],dist[t]+g[t][j]);}return dist[n];
}int main()
{scanf("%d%d",&n,&m);memset(g,0x3f,sizeof g);for(int i=1;i<=m;i++){int a,b,c;scanf("%d%d%d",&a,&b,&c);g[a][b]=min(g[a][b],c);}int t=dijkstra();printf("%d\n",t);
}
下面是2021年蓝桥杯省赛真题就是用到了Dijkstra算法,这题写起来非常简单就是一道模板题,只不过中间还穿插了一些最大公约数和最小公倍数的知识,题目和Ac代码如下,这题就留给读者你们自己思考啦!!!

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll e[2050][2050],dist[2050];
bool st[2050];ll gcd(ll a,ll b)//求公约数
{return a%b==0?b:gcd(b,a%b);
}ll lcm(ll a,ll b)//求最小公倍数
{return a*b/(gcd(a,b));
}int dijkstra()//Dijkstra算法
{memset(dist,0x3f,sizeof dist);dist[1]=0;for(int i=1;i<=2021;i++){int t=-1;if(!st[i]&&(t==-1||dist[t]>dist[i]))t=i;st[t]=true;for(int j=1;j<=2021;j++)dist[j]=min(dist[j],dist[t]+e[t][j]);}return dist[2021];
}int main()
{memset(e,0x3f,sizeof e);for(int i=1;i<=2021;i++){for(int j=i;j<=2021;j++){int k=j-i;if(k>21)break;else {e[i][j]=e[j][i]=lcm(i,j);}}}int ans=dijkstra();cout<<ans<<endl;
}

Dijkstra算法(蓝桥杯省赛真题)相关推荐

  1. 3位水仙花数计算pythonoj_Python解答蓝桥杯省赛真题之从入门到真题

    若发现此文章消失,则是在等待审核中,稍等一会儿即可显示,谢谢. 另外,我会尽量晚上上传更新题目. 此文章太长了,导致MD编辑器很卡,另写了一篇接续 传送门 Python解答蓝桥杯省赛真题之从入门到真题 ...

  2. 2018年第九届C/C++ A组蓝桥杯省赛真题(python解法)

    2018年第九届C/C++ A组蓝桥杯省赛真题 第一题:哪天返回 题目描述 小明被不明势力劫持.后莫名其妙被扔到x星站再无问津.小明得知每天都有飞船飞往地球,但需要108元的船票,而他却身无分文. 他 ...

  3. 2018年第九届C/C++ B组蓝桥杯省赛真题

    2018年第九届C/C++ B组蓝桥杯省赛真题 真题 第一题:第几天 第二题:明码 第三题:乘积尾零 第四题:测试次数 第五题:快速排序 第六题:递增三元组 第七题:螺旋折线 第八题:日志统计 第九题 ...

  4. 小唐开始刷蓝桥(一)2020年第十一届C/C++ B组第二场蓝桥杯省赛真题

    目录 一.门牌制作 二.既约分数 三.蛇形填数 四.跑步锻炼 五.七段码 六.成绩统计 七.回文日期 八.子串分值和 九.平面切分 十.字串排序 上一篇: 呆呆子,这就是小唐的第一篇啦! 下一篇: 小 ...

  5. 小唐开始刷蓝桥(六)2015年第六届C/C++ B组蓝桥杯省赛真题

    文章目录 前言 一.奖券数目 二.星系炸弹 三.三羊献瑞 四.格子中输出 五.九数组分数 六.加法变乘法 七.牌型种数 八.移动距离 九.垒骰子 十.生命之树 上一篇: 小唐开始刷蓝桥(五)2016年 ...

  6. 小唐开始刷蓝桥(三)2018年第九届C/C++ B组蓝桥杯省赛真题

    文章目录 前言 一.第几天 二.明码 三.乘积尾零 四.测试次数 五.快速排序 六.递增三元组 七.螺旋折线 八.日志统计 九.全球变暖 十.乘积最大 上一篇: 小唐开始刷蓝桥(二)2019年第十届C ...

  7. 小唐开始刷蓝桥(七)2014年第五届C/C++ B组蓝桥杯省赛真题

    文章目录 前言 一.啤酒和饮料 二.切面条 三.李白打酒 四.史丰收速算 五.打印图形 六.奇怪的分式 七.六角填数 八.蚂蚁感冒 九.地宫取宝 十.小朋友排队 上一篇: 小唐开始刷蓝桥(六)2015 ...

  8. 小唐开始刷蓝桥(八)2013年第四届C/C++ B组蓝桥杯省赛真题

    文章目录 前言 一.高斯日记 二.马虎的算式 三.第39级台阶 四.黄金连分数 五.前缀判断 六.三部排序 七.错误票据 八.翻硬币 九.带分数 十.连号区间数 上一篇: 小唐开始刷蓝桥(七)2014 ...

  9. 小唐开始刷蓝桥(四)2017年第八届C/C++ B组蓝桥杯省赛真题

    文章目录 前言 一.购物单 二.等差素数列 三.承压计算 四.方格分割 五.取数位 六.最大公共子串 七.日期问题 八.包子凑数 九.分巧克力 十.k倍区间 上一篇: 小唐开始刷蓝桥(三)2019年第 ...

最新文章

  1. Exchange 2013接收连接器介绍
  2. dockerfile中的run_Docker3-Dockerfile创建镜像的方法(推荐docker file这种方法)
  3. 《趣学算法 [陈小玉]》学习笔记01
  4. 小鹏汽车港股上市发售价定为每股165港元
  5. 代理类 invoke方法没有返回值怎么办_何为动态代理?
  6. 吴恩达 Deeplearning深度学习笔记v5.7 最新PDF版 免积分下载
  7. php date转换为时间戳,php中date转换时间戳的方法
  8. 计算机应用研究 增刊,计算机应用研究增刊是核心吗_计算机研究应用_计算机应用...
  9. Access Violation(非法访问)错误的解决方法
  10. 三门问题与神奇的贝叶斯大脑
  11. 怎样设置电脑宽带连接无线路由器设置路由器连接服务器,电脑设置无线路由器断线后自动连接的方法...
  12. Python爬虫实战案例:取喜马拉雅音频数据详解
  13. netty自定义通讯协议校验魔数
  14. 前馈神经网络与支持向量机实战 --- 手写数字识别
  15. Android多点触控揭秘
  16. 9.PMAC上位机-上位机发送指令
  17. Buiness Partner 名词解析
  18. oracle数据库数据误删除恢复方法
  19. Window SendMessage,PostMessage分析
  20. 什么是动态规划?动态规划的意义是什么?

热门文章

  1. PTA 循环结构 7-1 求cosx的近似值
  2. [OpenCV实战]47 基于OpenCV实现视觉显著性检测
  3. 国家采购网:有 DCMM 数据管理认证,加分!
  4. 中山联禾科技推出欧姆龙PLC联网模块
  5. 微服务间的桥梁 Feign
  6. 2fsk在matlab中的载频如何写,数字频率调制又称频移键控(FSK),二进制频移键控记作2FSK。数字频移键控是用载波的频率来传送数字...
  7. 如何查软件版本Linux,如何查看软件名称和版本号
  8. linux下ipvsadm命令,Linux中ipvsadm命令起什么作用呢?
  9. PwnTheBox(Crypto篇)---Rsa(爆破e)
  10. 千聊语音课程导出注意事项