2021年第十二届蓝桥杯 - 省赛 - C/C++大学A组 - D.路径
2021年第十二届蓝桥杯 - 省赛 - C/C++大学A组 - D.路径
Ideas
算法:最短路径
数据结构:图
思路:根据规则构图,单源最短路径Dijkstra算法。
首先构图其实很简单,就是按照题目的要求来就可以了,这里需要注意的就是最大公约数和最小公倍数的计算函数,其实可以当做模板背下来了。
def gcd(a, b):return a if b == 0 else gcd(b, a % b)def lcm(a, b):return a * b / gcd(a, b)
然后构造图的时候选择通过邻接矩阵的形式去构建。
graph = [[0] * 2021 for _ in range(2021)]for row in range(2021):for col in range(2021):graph[row][col] = float("inf") if abs(row - col) > 21 else lcm(row + 1, col + 1)
之后就是Dijkstra算法了,简单介绍一下。
Dijkstra单源最短路径算法
松弛操作:对于一对顶点要求最短路径,可以通过中转点将路径变短。
对于i、j两个节点,如果想让路径变短,只能通过第三个节点k来中转。举个例子,从 1->5 距离为10,但 1->2->5 距离变成9了。
单源最短路径问题指的是从一个点出发,求该点到其它所有顶点的最短路径,也就是说,只能计算起点只有一个的情况。
对于图G=<V, E>上带权的单源最短路径问题,Dijkstra算法设置一个集合S用来记录已经求得最短路径的顶点。
初始时把起点v0放入S中,集合S每并入一个新顶点vi,都要修改原点v0到集合V-S中顶点的当前最短路径长度值。
从起点到一个顶点的最短路径一定会经过至少一个“中转点”(我们认为起点也是一个“中转点”),如果我们想要求出起点到一个顶点的最短路径,那我们必须要先求出从起点到中转点的最短路径。
对于图G=<V, E>,将所有的点分为两类,一类是已经确定最短路径的点,称为“红点”,另一类是未确定最短路径的点,称为“白点”。
Dijkstra算法的思想:首先将起点的距离标记为0,而后进行n此循环,每次找出一个到起点距离最短的点,将它从白点变为红点,随后枚举所有的白点,如果以此红点为中转到达某个白点的路径更短的话,那么就更新。
通过Dijkstra最短路径算法可以求得结点1到其它所有结点的最短路径,最后直接输出结点1和节点2021之间的最短路径长度就OK啦。
Code
Python
import heapqdef gcd(a, b):return a if b == 0 else gcd(b, a % b)def lcm(a, b):return a * b / gcd(a, b)def Dijkstra(g, node):n, queue, visit = len(g), list(), set()heapq.heappush(queue, (0, node))distance = [float("inf") for _ in range(n)]distance[node] = 0while queue:dist, vertex = heapq.heappop(queue)visit.add(vertex)for i in range(n):val = g[vertex][i]if val != float("inf") and val not in visit and dist + val < distance[i]:distance[i] = dist + valheapq.heappush(queue, (dist + val, i))return distanceif __name__ == '__main__':graph = [[0] * 2021 for _ in range(2021)]for row in range(2021):for col in range(2021):graph[row][col] = float("inf") if abs(row - col) > 21 else lcm(row + 1, col + 1)dis = Dijkstra(graph, 0)print(int(dis[2021 - 1]))
Answer:10266837
2021年第十二届蓝桥杯 - 省赛 - C/C++大学A组 - D.路径相关推荐
- 2021年第十二届蓝桥杯 - 省赛 - C/C++大学B组 - I.双向排序
2021年第十二届蓝桥杯 - 省赛 - C/C++大学B组 - I.双向排序 Ideas 题目中给出了两种操作: 当 pi = 0 时,表示将 a1, a2, · · · , aqi 降序排列: 当 ...
- 2021年第十二届蓝桥杯 - 省赛 - C/C++大学C组 - D.相乘
Ideas 对于Python来说,都没有溢出,直接乘就完了. Code Python if __name__ == '__main__':for num in range(1, 1000000008) ...
- 2021第十二届蓝桥杯国赛总结-java大学c组
比赛结果 结果挺意外的,比赛中失误较多,送分题暴毙(审题失误),没把自己气死,结果算不错,但也挺可惜. 解答过程 1. 整数范围 答案:255 没想太多直接计算器算的,后来听符号位,但似乎不用考虑. ...
- 第十二届蓝桥杯省赛 C/C++大学B组 试题G:砝码称重
试题题目: 本题为编程题第二题 解题思路: 方法一:暴力求解 1.分析 首先利用数组W[N]W[N]W[N]记录NNN块砝码的质量. 模拟放取过程.先取第一块砝码放在天平上,再取第二块砝码 ...
- 2021年第十二届蓝桥杯省赛C/C++B组题解总结
前几天(2021.4.18)刚刚比完了2021年第十二届蓝桥杯省赛,本人参加的是软件组C++B组的比赛,本文包括了这一届C++B组的题目以及部分题解.感悟和总结. 目录 试题A.空间 试题B.卡片 试 ...
- 2021年第十二届蓝桥杯省赛B组(C/C++)第二场题解
文章目录 2021年第十二届蓝桥杯省赛B组(C/C++)第二场题解 1.求余 2.双阶乘 3.格点 4.整数分解 5.城邦 6.特殊年份 7.小平方 8.完全平方数 9.负载均衡 10.国际象棋 20 ...
- 2019 第十届蓝桥杯省赛C/C++大学B组 试题+题解
第十届蓝桥杯省赛C/C++大学B组 试题+题解 第十届蓝桥杯大赛软件类省赛 C/C++ 大学 B 组 考生须知 考试开始后,选手首先下载题目,并使用考场现场公布的解压密码解压试 题. 考试时间为 4 ...
- 2021年第十二届蓝桥杯省赛+国三C/C++B组参赛经历分享
目录 一些流水账 备赛总结 语言选择 一些问题 牢骚 最近蓝桥杯报名又开始了,先预祝家人们能取得好成绩~ 一些流水账 按照惯例,先简单地自我介绍一下:本人就读于西南某不知名双非院校+计算机弱校(不是凡 ...
- 2021年第十二届蓝桥杯省赛 Java B组 第一场 全部题解
暴力杯?dp杯! 重铸国二荣光,省三义不容辞 感谢评论区的大佬给出的思路还有指正的一些错误地方,现都已更正,当然如果还有其他更优解法的也欢迎评论区指出 c/c++和Java的B组题目都已更新,正在备考 ...
最新文章
- 阿里巴巴笔试题-马尔科夫(HMM)的特征
- 数组名和数组名取地址的区别
- ES shrink ——一般是结合rollover一起使用的,一开始没有看懂官方shrink文档,当看了这个之后就明白了...
- 2021年春季学期期末统一考试 劳动与社会保障法(本) 试题
- 浏览器访问网页的详细内部过程
- python爬虫实例100例-Python 练习实例1
- ESPNet: Efficient Spatial Pyramid of Dilated Convolutions for Semantic Segmentation(自动驾驶领域轻量级模型)
- 基于FPGA的中值滤波器设计
- 自己整理的Linux指令全集,附思维导图(适合刚入门的看),顺带命令大全网址方便查找指令
- acer软件保护卡怎么解除_Acer软件保护卡使用说明
- 这101个网站你要是没进过,那你就OUT了
- asp.net pdf如何转换成tif_PDF如何转换成PPT文档?怎么使用PDF转换成PPT的软件?
- 播放器显示服务器失败是什么意思,播放器没有办法播放
- ReferenceError: self is not defined
- Hyperspace初体验:Delta Lake表索引
- OneNote for Windows10 闪退 的解决办法
- 用 JPress 创建模板及发布文章
- 微信支付api_key
- 女神异闻录5(p5)系统拆解
- 记录js定时器产生 Deferred long-running timer task(s) to improve scrolling smoothness
热门文章
- 结合提供者模式解析Jenkins源码国际化的实现
- 微信公众号获取acess_token并存储(php)
- 使用Android应用调用WebService实现天气预报
- 原生android 权限管理,Android 权限管理(原生、EasyPermissions、RxPermissions)
- vue3与vue2的详细区别
- Java黑皮书课后题第7章:*7.1(指定等级)编写一个程序读入学生成绩,得到最高分best,然后根据下面的规则给出等级值。程序提示用户输入学生总数,然后提示用户输入所有的分数,最后显示等级给出结论
- C语言学习之函数调用递归问题,有5个学生坐在一起,问第5个学生多少岁?
- python基础--GIL全局解释器锁、Event事件、信号量、死锁、递归锁
- flask 项目基本框架的搭建
- docker之设置开机自启动(二)