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.路径相关推荐

  1. 2021年第十二届蓝桥杯 - 省赛 - C/C++大学B组 - I.双向排序

    2021年第十二届蓝桥杯 - 省赛 - C/C++大学B组 - I.双向排序 Ideas 题目中给出了两种操作: 当 pi = 0 时,表示将 a1, a2, · · · , aqi 降序排列: 当 ...

  2. 2021年第十二届蓝桥杯 - 省赛 - C/C++大学C组 - D.相乘

    Ideas 对于Python来说,都没有溢出,直接乘就完了. Code Python if __name__ == '__main__':for num in range(1, 1000000008) ...

  3. 2021第十二届蓝桥杯国赛总结-java大学c组

    比赛结果 结果挺意外的,比赛中失误较多,送分题暴毙(审题失误),没把自己气死,结果算不错,但也挺可惜. 解答过程 1. 整数范围 答案:255 没想太多直接计算器算的,后来听符号位,但似乎不用考虑. ...

  4. 第十二届蓝桥杯省赛 C/C++大学B组 试题G:砝码称重

    试题题目: 本题为编程题第二题 解题思路: 方法一:暴力求解 1.分析    首先利用数组W[N]W[N]W[N]记录NNN块砝码的质量.    模拟放取过程.先取第一块砝码放在天平上,再取第二块砝码 ...

  5. 2021年第十二届蓝桥杯省赛C/C++B组题解总结

    前几天(2021.4.18)刚刚比完了2021年第十二届蓝桥杯省赛,本人参加的是软件组C++B组的比赛,本文包括了这一届C++B组的题目以及部分题解.感悟和总结. 目录 试题A.空间 试题B.卡片 试 ...

  6. 2021年第十二届蓝桥杯省赛B组(C/C++)第二场题解

    文章目录 2021年第十二届蓝桥杯省赛B组(C/C++)第二场题解 1.求余 2.双阶乘 3.格点 4.整数分解 5.城邦 6.特殊年份 7.小平方 8.完全平方数 9.负载均衡 10.国际象棋 20 ...

  7. 2019 第十届蓝桥杯省赛C/C++大学B组 试题+题解

    第十届蓝桥杯省赛C/C++大学B组 试题+题解 第十届蓝桥杯大赛软件类省赛 C/C++ 大学 B 组 考生须知 考试开始后,选手首先下载题目,并使用考场现场公布的解压密码解压试 题. 考试时间为 4 ...

  8. 2021年第十二届蓝桥杯省赛+国三C/C++B组参赛经历分享

    目录 一些流水账 备赛总结 语言选择 一些问题 牢骚 最近蓝桥杯报名又开始了,先预祝家人们能取得好成绩~ 一些流水账 按照惯例,先简单地自我介绍一下:本人就读于西南某不知名双非院校+计算机弱校(不是凡 ...

  9. 2021年第十二届蓝桥杯省赛 Java B组 第一场 全部题解

    暴力杯?dp杯! 重铸国二荣光,省三义不容辞 感谢评论区的大佬给出的思路还有指正的一些错误地方,现都已更正,当然如果还有其他更优解法的也欢迎评论区指出 c/c++和Java的B组题目都已更新,正在备考 ...

最新文章

  1. 阿里巴巴笔试题-马尔科夫(HMM)的特征
  2. 数组名和数组名取地址的区别
  3. ES shrink ——一般是结合rollover一起使用的,一开始没有看懂官方shrink文档,当看了这个之后就明白了...
  4. 2021年春季学期期末统一考试 劳动与社会保障法(本) 试题
  5. 浏览器访问网页的详细内部过程
  6. python爬虫实例100例-Python 练习实例1
  7. ESPNet: Efficient Spatial Pyramid of Dilated Convolutions for Semantic Segmentation(自动驾驶领域轻量级模型)
  8. 基于FPGA的中值滤波器设计
  9. 自己整理的Linux指令全集,附思维导图(适合刚入门的看),顺带命令大全网址方便查找指令
  10. acer软件保护卡怎么解除_Acer软件保护卡使用说明
  11. 这101个网站你要是没进过,那你就OUT了
  12. asp.net pdf如何转换成tif_PDF如何转换成PPT文档?怎么使用PDF转换成PPT的软件?
  13. 播放器显示服务器失败是什么意思,播放器没有办法播放
  14. ReferenceError: self is not defined
  15. Hyperspace初体验:Delta Lake表索引
  16. OneNote for Windows10 闪退 的解决办法
  17. 用 JPress 创建模板及发布文章
  18. 微信支付api_key
  19. 女神异闻录5(p5)系统拆解
  20. 记录js定时器产生 Deferred long-running timer task(s) to improve scrolling smoothness

热门文章

  1. 结合提供者模式解析Jenkins源码国际化的实现
  2. 微信公众号获取acess_token并存储(php)
  3. 使用Android应用调用WebService实现天气预报
  4. 原生android 权限管理,Android 权限管理(原生、EasyPermissions、RxPermissions)
  5. vue3与vue2的详细区别
  6. Java黑皮书课后题第7章:*7.1(指定等级)编写一个程序读入学生成绩,得到最高分best,然后根据下面的规则给出等级值。程序提示用户输入学生总数,然后提示用户输入所有的分数,最后显示等级给出结论
  7. C语言学习之函数调用递归问题,有5个学生坐在一起,问第5个学生多少岁?
  8. python基础--GIL全局解释器锁、Event事件、信号量、死锁、递归锁
  9. flask 项目基本框架的搭建
  10. docker之设置开机自启动(二)