IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 2021年第十二届蓝桥杯 - 省赛 - C/C++大学A组 - D.路径 -> 正文阅读

[C++知识库]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 heapq


def 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] = 0
	
	while 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 + val
				heapq.heappush(queue, (dist + val, i))
	return distance


if __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

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-15 22:13:21  更:2022-03-15 22:15:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:39:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码