Dijkstra算法在《庆余年》中的应用:范闲的皇宫之旅
❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容,和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣!
推荐:数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注
导航:
- LeetCode解锁1000题: 打怪升级之旅:每题都包括3-5种算法,以及详细的代码实现,刷题面试跳槽必备
- 漫画版算法详解:通过漫画的形式和动态GIF图片把复杂的算法每一步进行详细可视解读,看一遍就掌握
- python源码解读:解读python的源代码与调用关系,快速提升代码质量
- python数据分析可视化:企业实战案例:企业级数据分析案例与可视化,提升数据分析思维和可视化能力
- 程序员必备的数学知识与应用:全面详细的介绍了工程师都必备的数学知识
期待与您一起探索技术、持续学习、一步步打怪升级 欢迎订阅本专栏❤️❤️
引言
《庆余年》是一部引人入胜的古装剧,讲述了范闲在风云变幻的朝堂与江湖中历险成长的故事。在这个复杂的世界中,范闲需要不断地做出重要的决策,要是范闲是学好算法穿越的话,可以想象能有多强,本文将通过一个情境,展示如何使用Python中的Dijkstra算法来帮助范闲找到在京城内安全抵达目的地的最短路径。
背景
好的,让我们设定一个范闲要到皇宫偷钥匙的情境,并将各个点引用《庆余年》中的真实地名。我们将范府、街市、酒楼、戏院、客栈和皇宫作为节点,并设置相应的路径距离。
地图节点及其关系
- 范府 (起点)
- 街市 (A)
- 酒楼 (B)
- 戏院 (C)
- 客栈 (D)
- 皇宫 (E) (终点)
路径距离
我们假设以下路径距离:
- 范府到街市:2
- 范府到酒楼:5
- 街市到戏院:4
- 街市到客栈:7
- 酒楼到客栈:3
- 戏院到客栈:1
- 戏院到皇宫:3
- 客栈到皇宫:2
情境图解
以下是这个情境的ASCII图解:
范府/ \2/ \5/ \
街市-----酒楼| \ || \ || 4\ |3| \ || 7 \ || \|客栈---戏院1\ 3 / \ / 皇宫
算法和实现步骤
好的,让我们详细介绍Dijkstra算法的算力和实现步骤,并确保结合《庆余年》的情境,清晰地展示范闲从范府到皇宫的最短路径。
Dijkstra算法简介
Dijkstra算法是一种经典的图搜索算法,用于查找图中节点之间的最短路径。它以贪心的方式逐步扩展最短路径集,直至找到目标节点。该算法适用于加权图,并要求权重为非负数。
算力分析
- 时间复杂度:Dijkstra算法的时间复杂度取决于使用的数据结构。使用优先队列(如二叉堆)时,时间复杂度为O((V + E) log V),其中V是节点数,E是边数。
- 空间复杂度:空间复杂度为O(V),用于存储节点的距离和优先队列。
实现步骤
-
初始化:
- 将起点的最短路径设置为0,其余所有节点的最短路径设置为无穷大(∞)。
- 将所有节点标记为未访问。
- 使用优先队列(最小堆)存储节点及其当前的最短路径。
-
选取当前节点:
- 从优先队列中取出当前最短路径最小的节点,作为当前节点。
-
更新邻居节点的最短路径:
- 对于当前节点的每一个邻居节点,计算从起点到该邻居节点的路径长度。
- 如果计算得到的路径长度小于当前存储的路径长度,则更新该邻居节点的最短路径,并将其重新加入优先队列。
-
标记节点为已访问:
- 将当前节点标记为已访问。
-
重复步骤2-4,直到所有节点都被访问过或优先队列为空。
-
返回结果:
- 返回从起点到所有节点的最短路径。
Python实现Dijkstra算法
我们使用Dijkstra算法计算范闲从范府到皇宫的最短路径。
import heapqdef dijkstra(graph, start):# 初始化shortest_paths = {node: float('inf') for node in graph}shortest_paths[start] = 0priority_queue = [(0, start)]visited = set()while priority_queue:(current_distance, current_node) = heapq.heappop(priority_queue)if current_node in visited:continuevisited.add(current_node)for neighbor, weight in graph[current_node].items():distance = current_distance + weightif distance < shortest_paths[neighbor]:shortest_paths[neighbor] = distanceheapq.heappush(priority_queue, (distance, neighbor))return shortest_paths# 示例图
graph = {'范府': {'街市': 2, '酒楼': 5},'街市': {'范府': 2, '戏院': 4, '客栈': 7},'酒楼': {'范府': 5, '客栈': 3},'戏院': {'街市': 4, '客栈': 1, '皇宫': 3},'客栈': {'街市': 7, '酒楼': 3, '戏院': 1, '皇宫': 2},'皇宫': {'戏院': 3, '客栈': 2}
}# 计算最短路径
start_node = '范府'
shortest_paths = dijkstra(graph, start_node)# 输出结果
print(f"从{start_node}出发到各节点的最短路径:")
for node, distance in shortest_paths.items():print(f"到{node}的最短路径是{distance}")
好的,我们将按照您提供的图进行详细的Dijkstra算法步骤解析。
算法图解
初始状态
每个节点的最短路径都设置为无穷大(∞),除了起点范府,其最短路径为0:
节点 最短路径
范府 0
街市 ∞
酒楼 ∞
戏院 ∞
客栈 ∞
皇宫 ∞
ASCII图解
以下是详细标注的ASCII图解,确保每个路径和距离准确对应:
范府/ \2/ \5/ \
街市-----酒楼| \ || \ || 4\ |3| \ || 7 \ || \|客栈---戏院1\ 3 / \ / 皇宫
详细步骤图解
步骤1:从范府(距离为0)出发,更新邻居街市和酒楼的距离。
更新后:
节点 最短路径
范府 0
街市 2
酒楼 5
戏院 ∞
客栈 ∞
皇宫 ∞
图解:
范府(0)/ \2/ \5/ \
街市(2) 酒楼(5)| \ || \ || 4\ |3| \ || 7 \ || \|客栈(∞)戏院(∞)1\ 3 / \ / 皇宫(∞)
步骤2:选择当前距离最小的未访问节点(街市),更新街市的邻居戏院和客栈的距离。
更新后:
节点 最短路径
范府 0
街市 2
酒楼 5
戏院 6 (2+4)
客栈 9 (2+7)
皇宫 ∞
图解:
范府(0)/ \2/ \5/ \
街市(2) 酒楼(5)| \ || \ || 4\ |3| \ || 7 \ || \|客栈(9)戏院(6)1\ 3 / \ / 皇宫(∞)
步骤3:选择当前距离最小的未访问节点(戏院),更新戏院的邻居客栈和皇宫的距离。
更新后:
节点 最短路径
范府 0
街市 2
酒楼 5
戏院 6
客栈 7 (6+1)
皇宫 9 (6+3)
图解:
范府(0)/ \2/ \5/ \
街市(2) 酒楼(5)| \ || \ || 4\ |3| \ || 7 \ || \|客栈(7)戏院(6)1\ 3 / \ / 皇宫(9)
步骤4:选择当前距离最小的未访问节点(客栈),更新客栈的邻居皇宫的距离。
更新后:
节点 最短路径
范府 0
街市 2
酒楼 5
戏院 6
客栈 7
皇宫 9 (7+2)
图解:
范府(0)/ \2/ \5/ \
街市(2) 酒楼(5)| \ || \ || 4\ |3| \ || 7 \ || \|客栈(7)戏院(6)1\ 3 / \ / 皇宫(9)
最终结果:从范府到各个节点的最短路径为:
从范府出发到各节点的最短路径:
到范府的最短路径是0
到街市的最短路径是2
到酒楼的最短路径是5
到戏院的最短路径是6
到客栈的最短路径是7
到皇宫的最短路径是9
通过这些步骤,范闲最终找到从范府到皇宫的最短路径为9。
结论
通过本文,我们展示了如何利用Python中的Dijkstra算法在《庆余年》中的情境下帮助范闲找到最优路径。虽然这只是一个虚构的例子,但Dijkstra算法在现实世界中的应用广泛,如交通导航、网络路由等。希望本文能帮助读者理解这一强大算法的基本原理和实现方法,并激发出更多的创意,将技术和艺术有机结合。
🌹🌹如果觉得这篇文对你有帮助的话,记得一键三连关注、赞👍🏻、收藏是对作者最大的鼓励,非常感谢 ❥(^_-)
❤️❤️作者知识有限,如有错误,请各位大佬评论区批评指正,不胜感激❥(^_-)
相关文章:
Dijkstra算法在《庆余年》中的应用:范闲的皇宫之旅
❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容,和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣! 推荐:数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航: LeetCode解锁100…...
HTML静态网页成品作业(HTML+CSS)——利物浦足球俱乐部介绍网页设计制作(5个页面)
🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,共有5个页面。 二、作品演示 三、代码目录 四、网站代码 HTML部分代…...
mac 查看占用80端口的命令
在 Mac 上,如果你想查看哪个进程正在使用 80 端口,你可以使用 lsof 命令。这个命令非常强大,用于列出被进程打开或使用的文件信息。 打开你的终端,并输入以下命令: sudo lsof -i :80这里,-i :80 选项告诉…...
【Qt常用控件】—— 布局管理器
目录 前言 (一)垂直布局 (二)水平布局 (三)网格布局 (四)表单布局 (五)分组布局 (六)Spacer 总结 前言 之前使⽤Qt在界⾯上…...
模板中的右值引用(万能引用)、引用折叠与完美转发
模板中的右值引用(万能引用)、引用折叠与完美转发 文章目录 模板中的右值引用(万能引用)、引用折叠与完美转发一、万能引用与引用折叠1. 模板中的右值引用2. 自动类型推导(auto)与万能引用3. 引用折叠与万能引用4. lambda表达式捕…...
Nacos启动报错:[db-load-error]load jdbc.properties error
在学习Nacos中间件时,出现了一个错误,竟然启动报错!!!! 这个错误第一次遇见,当时我感觉大体就是--数据库连接方面的错误。 可是,对于初学者的我来说一脸懵啊??ÿ…...
5.23相关性分析
相关性分析是一件很自然而然的事情,在生活中和科学研究中,我们都可能会不由自主地关注两件或者多件事情之间的联系。比如性别和方向感有没有关系,有多大关系,辨别不同事物时如何说明特征的科学性(也就是该特征和事物的…...
使用 Sonatype Nexus Repository Manager 如何安装npm.md
1. 安装与启动 Nexus2. 登录 Nexus Web UI3. 创建 npm 仓库4. (可选)配置 npm 代理仓库5. 创建 npm 仓库组6. 配置 npm 客户端7. 测试和使用 Sonatype Nexus Repository Manager (通常简称 Nexus) 是一个强大的二进制管理系统,用于存储和管理…...
console如何连接远程机器上的java程序
启动参数 -Djava.rmi.server.hostname192.168.1.10 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port12345 -Dcom.sun.management.jmxremote.sslfalse -Dcom.sun.management.jmxremote.authenticatefalse2.jdk安装目录/bin下执行 go jconsole![在这里插入…...
高稳定数显芯片防干扰抗噪数码屏驱动高亮LED驱动IC-VK16K33A/AA 最大13×3的按键扫描
产品型号:VK16K33A/AA 产品品牌:永嘉微电/VINKA 封装形式:SOP28/SSOP28 原厂,工程服务,技术支持! 概述 VK16K33A/AA是一种带按键扫描接口的数码管或点阵LED驱动控制专用芯片,内部集成有数据…...
Redis离线安装(单机)
目录 1-环境准备1-1下载redis-4.0.11.tar.gz1-2gcc环境 2-上传解压3-编译安装(需要gcc环境)4-配置redis5-启动Redis6-开启防火墙(root)7-添加开机启动脚本8-设置权限9-设置开机启动10-测试redis服务11-检查是否安装成功12-创建redis命令软连接13-测试redis14-必要时设置防火墙 …...
[Algorithm][动态规划][路径问题][不同路径][不同路径Ⅱ][珠宝的最高价值]详细讲解
目录 1.不同路径1.题目链接2.算法原理详解3.代码实现 2.不同路径 II1.题目链接2.算法原理详解3.代码实现 3.珠宝的最高价值1.题目链接2.算法原理详解3.代码实现 1.不同路径 1.题目链接 不同路径 2.算法原理详解 思路: 确定状态表示 -> dp[i][j]的含义 走到dp[…...
ChatGPT移动应用收入在GPT-4o发布后迎来最大涨幅
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
汉语拼音 如何 转化成粤语拼音 的
将汉语拼音(普通话拼音)转化为粤语拼音涉及到对声母、韵母以及声调的对照和调整。以下是详细的转换步骤和注意事项: 一、转换步骤 识别普通话拼音的声母和韵母查找对应的粤语拼音声母和韵母应用粤语声调 二、声母对照表 普通话拼音粤语拼…...
本地电子邮件测试工具-MailHog
通过MailHog,可以在浏览器中查看本机发的邮件内容,而无需发送到外网。 https://github.com/mailhog/MailHog在 macOS 环境下,下载文件后: 添加可执行权限:chmod x MailHog_darwin_amd64 运行:./MailHog_darwin_amd64 浏览器打开查看邮件:htt…...
Java18新特性
Java 18引入了若干新特性,以增强语言的功能性和性能。具体如下: 服务提供者接口(Service Provider Interfaces, SPI):允许开发者为Java模块系统定义服务加载机制,从而能够更灵活地发现和加载服务实现。简单…...
大象资讯:PostgreSQL 17 Beta 1 发布!
↑ 关注“少安事务所”公众号,欢迎⭐收藏,不错过精彩内容~ PostgreSQL 全球开发小组 发布于 2024-05-23 PostgreSQL 全球开发小组宣布,PostgreSQL 17 的第一个测试版本现已可供下载。此版本包含 PostgreSQL 17 正式发布时将提供的所有功能的预…...
Rust:如何在 Windows 的 Linux 子系统(WSL)下安装
一、安装步骤 在Windows Subsystem for Linux (WSL)下安装Rust,可以按照以下步骤进行: 打开WSL终端: 首先,确保你的WSL已经安装并正常运行。你可以在Windows搜索栏中输入“WSL”并选择你安装的Linux发行版(如Ubuntu&a…...
工具分享:VsCode注释神器,koro1FileHeader
他是有官方Wiki的。 https://github.com/OBKoro1/koro1FileHeader/wiki/ 项目在GitHub上开源。以下摘录部分wiki,用作介绍分享在这里插入代码片 如何找到setting.json设置模板 简单的输入命令 打开VSCode命令面板: mac: command p window: ctrl p输入> Ope…...
水面漂浮物生活垃圾识别检测系统
水面漂浮物生活垃圾识别检测系统通过现场监控摄像机对河道湖面等水体进行实时监测,水面漂浮物生活垃圾识别检测系统借助智能视频分析技术和YOLO深度学习技术,系统能够自动识别和抓拍水面上的垃圾漂浮物。一旦系统检测到有垃圾漂浮在水面上,立…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...

