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),用于存储节点的距离和优先队列。

实现步骤

  1. 初始化

    • 将起点的最短路径设置为0,其余所有节点的最短路径设置为无穷大(∞)。
    • 将所有节点标记为未访问。
    • 使用优先队列(最小堆)存储节点及其当前的最短路径。
  2. 选取当前节点

    • 从优先队列中取出当前最短路径最小的节点,作为当前节点。
  3. 更新邻居节点的最短路径

    • 对于当前节点的每一个邻居节点,计算从起点到该邻居节点的路径长度。
    • 如果计算得到的路径长度小于当前存储的路径长度,则更新该邻居节点的最短路径,并将其重新加入优先队列。
  4. 标记节点为已访问

    • 将当前节点标记为已访问。
  5. 重复步骤2-4,直到所有节点都被访问过或优先队列为空。

  6. 返回结果

    • 返回从起点到所有节点的最短路径。

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算法在现实世界中的应用广泛,如交通导航、网络路由等。希望本文能帮助读者理解这一强大算法的基本原理和实现方法,并激发出更多的创意,将技术和艺术有机结合。

🌹🌹如果觉得这篇文对你有帮助的话,记得一键三连关注、赞👍🏻、收藏是对作者最大的鼓励,非常感谢 ❥(^_-)

❤️❤️作者知识有限,如有错误,请各位大佬评论区批评指正,不胜感激❥(^_-)
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/329050.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【探索数据结构】线性表之双链表

&#x1f389;&#x1f389;&#x1f389;欢迎莅临我的博客空间&#xff0c;我是池央&#xff0c;一个对C和数据结构怀有无限热忱的探索者。&#x1f64c; &#x1f338;&#x1f338;&#x1f338;这里是我分享C/C编程、数据结构应用的乐园✨ &#x1f388;&#x1f388;&…

MT3041 多项式变换求值

注意点&#xff1a; 1.使用单调栈 2.用ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);避免超时 3.此题除了ans最好不要用long long&#xff0c;如果a[]和b[]都是long long 类型&#xff0c;可能会超内存 4.ans (ans % p p) % p;防止负数 5.使用秦九韶算法计算指数…

【Linux】语言级文件接口与系统级文件接口

目录 前言 一、回顾C语言中的文件操作 二、认识文件缓冲区 三、Linux系统提供的文件接口 四、文件描述符fd简介 Linux下C语言文件接口简单模拟实现 前言 每个编程语言都有自己的文件操作方法&#xff0c;在不同的操作系统下相同的语言有相同的文件操作方法。这是如何实现…

声音转文本(免费工具)

声音转文本&#xff1a;解锁语音技术的无限可能 在当今这个数字化时代&#xff0c;信息的传递方式正以前所未有的速度进化。从手动输入到触控操作&#xff0c;再到如今的语音交互&#xff0c;技术的发展让沟通变得更加自然与高效。声音转文本&#xff08;Speech-to-Text, STT&…

git拉取项目前需要操作哪些?

1.输入 $ ssh-keygen -t rsa -C "秘钥说明" 按enter键 2.出现 ssh/id_rsa&#xff1a;(输入也可以不输入也可以) 然后按enter键 3.出现empty for no passphrase&#xff1a;(输入也可以不输入也可以) 然后按enter键 4.出现same passphrase again: (输入也可以不输入也…

异常检测 | PCA马氏距离异常值检测(Matlab)

异常检测 | PCA马氏距离异常值检测&#xff08;Matlab&#xff09; 目录 异常检测 | PCA马氏距离异常值检测&#xff08;Matlab&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab Pca 马氏距离异常值检测&#xff0c;剔除异常样本&#xff0c;置信椭圆可…

15:00面试,15:08就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到8月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

4. C++入门:内联函数、auto关键字、范围for及nullptr

内联函数 概念 以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开&#xff0c;没有函数调用建立栈帧的开销&#xff0c;内联函数提升程序运行的效率 对比C的宏 C语言不足&#xff1a;宏 #define ADD(x, y) ((x)(y))int main() {int ret…

OpenFeign高级用法:缓存、QueryMap、MatrixVariable、CollectionFormat优雅地远程调用

码到三十五 &#xff1a; 个人主页 微服务架构中&#xff0c;服务之间的通信变得尤为关键。OpenFeign&#xff0c;一个声明式的Web服务客户端&#xff0c;使得REST API的调用变得更加简单和优雅。OpenFeign集成了Ribbon和Hystrix&#xff0c;具有负载均衡和容错的能力&#xff…

期权策略交易怎么做?怎么选择期权策略?

今天期权懂带你了解期权策略交易怎么做&#xff1f;怎么选择期权策略&#xff1f;期权交易是一种金融衍生品交易方式&#xff0c;它给予购买者在未来特定时间内以特定价格购买&#xff08;或出售&#xff09;标的资产的权利。 期权策略交易怎么做&#xff1f; 配对看跌期权&am…

vue+springboot实现echarts数据图统计

①vue项目修改配置 安装依赖&#xff1a; npm i echarts -S 修改路由index.js&#xff1a; import Vue from vue import VueRouter from vue-router import Manager from ../views/Manager.vue // 解决导航栏或者底部导航tabBar中的vue-router在3.0版本以上频繁点击菜单报错…

00.OpenLayers快速开始

00OpenLayers快速开始 官方文档&#xff1a; 快速开始&#xff1a;https://openlayers.org/doc/quickstart.html 需要node环境 一、设置新项目 npm create ol-app my-app cd my-app npm start第一个命令将创建一个名为 my-app​ 的目录&#xff08;如果您愿意&#xff0c;…

Python筑基之旅-MySQL数据库(一)

目录 一、MySQL数据库 1、简介 2、优点 2-1、开源和免费 2-2、高性能 2-3、可扩展性 2-4、易用性 2-5、灵活性 2-6、安全性和稳定性 2-7、丰富的功能 2-8、结合其他工具和服务 2-9、良好的兼容性和移植性 3、缺点 3-1、对大数据的支持有限 3-2、缺乏全文…

前端面试:项目细节重难点问题分享

面试官提问&#xff1a;我现在给你出一个项目实际遇到的问题&#xff1a;由于后端比较忙&#xff0c;所以我们这边的列表数据排序需要前端最近实现&#xff0c;那你会怎么实现排序呢&#xff1f; 答&#xff1a;我的回答&#xff1a;确实&#xff0c;数据都是由后端实现的&…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-19讲 串口实验UART

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

嵌入式硬件中PCB走线与过孔的电流承载能力分析

简介 使用FR4敷铜板PCBA上各个器件之间的电气连接是通过其各层敷着的铜箔走线和过孔来实现的。 由于不同产品、不同模块电流大小不同,为实现各个功能,设计人员需要知道所设计的走线和过孔能否承载相应的电流,以实现产品的功能,防止过流时产品烧毁。 文中介绍设计和测试FR4敷…

Windows系统安装OpenSSH使用VScode远程连接内网Linux服务器开发

文章目录 &#x1f4a1;推荐 前言1、安装OpenSSH2、VS Code配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网…

Nginx/阿里云/二级域名的配置和使用

阿里云域名解析配置如下&#xff1a; nginx配置如下&#xff1a; 访问地址&#xff1a; zhadmin.iotzzh.com image.png

Hotcoin Research | 市场洞察:2024年5月13日-5月19日

加密货币市场表现 目前&#xff0c;加密货币总市值为1.32万亿&#xff0c;BTC占比54.41%。 本周行情呈现震荡上行的态势&#xff0c;BTC在5月15日-16日&#xff0c;有一波大的拉升&#xff0c;周末为震荡行情。BTC现价为67125美元。 上涨的主要原因&#xff1a;美国4月CPI为3…

深度学习之基于YoloV5钢材微小缺陷检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与目标 在钢材生产过程中&#xff0c;由于各种因素&#xff0c;钢材表面可能会出现微小缺陷&#xff…