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.mzph.cn/bicheng/13545.shtml

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

相关文章

GPT‑4o普通账户也可以免费用

网址 https://chatgpt.com/ 试了一下&#xff0c;免费的确实显示GPT‑4o的模型&#xff0c;问了一下可以联网&#xff0c;不知道能不能通过插件出图 有兴趣的可以试试

Acrobat Pro DC 2024 Mac软件安装包下载PDF2024 Mac安装教程

安装 步骤 1&#xff0c;双击打开下载好的安装包。 2&#xff0c;选择acrobat dc installer.pkg双击启动安装程序。 3&#xff0c;点击继续。 4&#xff0c;点击继续。 5&#xff0c;点击继续。 6&#xff0c;点击安装。 7&#xff0c;输入电脑密码。 8&#xff0c;软件安装中…

“手撕”String类+练习题

一、什么是String类 简单讲&#xff1a;是一个类&#xff01;创建字符串和字符串方法的类。 用 圈起来的叫字符&#xff0c;比如&#xff1a;a,b....里面只能有一个char类型的字符。 用" "圈起来的叫字符串&#xff0c;比如&#xff1a;"abc"..里面可以连…

如何搭建Sphinx文档

环境准备 Linux CentOS 7 方案 搭建一个文档网站&#xff0c;本文档使用的是tomcatsphinx。 Tomcat可以快速搭建出http服务&#xff0c;也可以使用apache httpd。 Sphinx作为文档网页自动生成工具&#xff0c;可以从reStructured文档转换为html文件。 Tomcat安装 创建/…

华为设备WLAN配置之AP上线

WLAN基础配置之AP上线 配置WLAN无线网络的第一阶段&#xff0c;AP上线技术&#xff1a; 实验目标&#xff1a;使得AP能够获得来自AC的DHCP地址服务的地址&#xff0c;且是该网段地址池中的IP。 实验步骤&#xff1a; 1.把AC当作三层交换机配置虚拟网关 sys Enter system view,…

【XuperChain】一、搭建第一条区块链节点

一、准备环境&#xff1a; 下载git和golang即可 apt install git apt install golang二、拉取代码&#xff0c;编译XuperChain 通过此命令拉取XuperChain源码到本地 git clone https://github.com/xuperchain/xuperchain.git 拉取成功后&#xff0c;会代码保存到了xuperChain…

使用Python生成一束玫瑰花

520到了&#xff0c;没时间买花&#xff1f;我们来生成一个电子的。 Python不仅是一种强大的编程语言&#xff0c;用于开发应用程序和分析数据&#xff0c;它也可以用来创造美丽的艺术作品。在这篇博客中&#xff0c;我们将探索如何使用Python生成一束玫瑰花的图像。 准备工作…

TransFormer学习之VIT算法解析

1.算法简介 本文主要对VIT算法原理进行简单梳理&#xff0c;下图是一个大佬整理的网络整体的流程图&#xff0c;清晰明了&#xff0c;其实再了解自注意力机制和多头自注意力机制后&#xff0c;再看VIT就很简单了 受到NLP领域中Transformer成功应用的启发&#xff0c;ViT算法尝…

详解ArcGIS 水文分析模型构建

目录 前言 项目环境、条件 Dem 数据预览 ArcGIS模型构建器 模型搭建 填洼 流向 流量 河流长度 栅格计算器 河流链接 河网分级 栅格河网矢量化 绘制倾泻点 栅格流域提取 集水区 盆域分析 栅格转面 模型应用 导出 py 文件 完善脚本 最终效果 结束语 前言 …

【时间复杂度和空间复杂度之间的故事】

【时间复杂度和空间复杂度之间的故事】 一.前言 二.时间复杂度定义时间复杂度的计算规则习题 三.空间复杂度定义计算方法习题空间复杂度 O(1)空间复杂度 O(n) 本文主要讲解关于时间复杂度与空间复杂度 &#x1f600;&#x1f603;&#x1f601;&#x1f601;&#x1f607;&…

FastAPI单元测试:使用TestClient轻松测试你的API

当使用FastAPI进行单元测试时&#xff0c;一个重要的工具是TestClient类。TestClient类允许我们模拟对FastAPI应用程序的HTTP请求&#xff0c;并测试应用程序的响应。这使我们能够在不启动服务器的情况下对API进行全面的测试。 下面我将详细讲解TestClient的使用方法和常见操作…

10大桌面软件前端框架,那个是您的最爱呢?

桌面端前端框架是用于构建桌面应用程序的前端框架&#xff0c;以下是一些常用的桌面端前端框架&#xff1a; 1. Electron&#xff1a; Electron是一个开源的桌面应用程序开发框架&#xff0c;可以使用HTML、CSS和JavaScript构建跨平台的桌面应用程序&#xff0c;例如VS Code、…

2024 年第四届长三角高校数学建模竞赛赛题B题超详细解题思路+代码分享

B题 人工智能范式的物理化学家 问题一问题二问题三问题四问题五完整代码与文档获取 B题思路详细解析分享给大家&#xff0c;还会继续更新完成具体的求解过程&#xff0c;以及全部的代码与技术文档&#xff0c;都会直接给大家分享的哦~需要完整代码直接看到最后哦 问题一 针对问…

谈谈【软件测试的基础知识,基础模型】

关于软件测试的基本概念和基本模型 前言一个优秀的测试人员具备的素质关于需求测试用例软件错误(BUG)概念开发模型瀑布模型&#xff08;Waterfall Model&#xff09;螺旋模型&#xff08;Spiral Model&#xff09; 前言 首先,什么是软件测试? 通俗来讲:软件测试就是找BUG&…

【配置】雷池WAF社区版安装

官方文档点击跳转 什么是雷池 雷池&#xff08;SafeLine&#xff09;是长亭科技耗时近 10 年倾情打造的 WAF&#xff0c;核心检测能力由智能语义分析算法驱动。 什么是 WAF WAF 是 Web Application Firewall 的缩写&#xff0c;也被称为 Web 应用防火墙。 区别于传统防火墙…

记某src通过越权拿下高危漏洞

在挖掘某SRC时&#xff0c;遇到了一个社区网站&#xff0c;社区站点是我在挖掘SRC时比较愿意遇到的&#xff0c;因为它们可探索的内容是较多的&#xff0c;幸运地&#xff0c;通过两个接口构造参数可进行越权&#xff0c;从而获得整个网站用户的信息。 图片以进行脱敏处理。在…

单词可交互的弧形文本

在一个项目中&#xff0c;要求把少儿读本做成电子教材呈现出来&#xff0c;电子书的排版要求跟纸质书一致。其中&#xff0c;英语书有个需求&#xff1a;书中有些不规则排版的文本&#xff08;如下图所示&#xff09;&#xff0c;当随书音频播放时&#xff0c;被读到的文本要求…

gin框架学习笔记(四) ——参数绑定与参数验证

参数绑定 前言 在Gin框架中我们可以利用bind来将前段传递过来的参数与结构体进行参数绑定与参数校验&#xff0c;而这bind的方式主要有以下两种: Mustbind:一般使用较少&#xff0c;因为参数校验失败会改变状态码Shouldbind&#xff1a;主要使用上的校验方法&#xff0c;校验…

Elasticsearch - HTTP

文章目录 安装基本语法索引创建索引查看索引删除索引 文档创建文档更新文档匹配查询多条件查询聚合查询映射 安装 https://www.elastic.co/downloads/past-releases/elasticsearch-7-17-0 下载完成启动bin/elasticsearch服务&#xff0c;可以在Postman调试各种请求。 基本语法…

高稳定LED驱动IC防干扰数显驱动控制器热水器LED驱动芯片VK1650 SOP16/DIP16 原厂FAE支持

产品型号&#xff1a;VK1650 产品品牌&#xff1a;永嘉微电/VINKA 封装形式&#xff1a;SOP16/DIP16 工程服务&#xff0c;技术支持&#xff01; 概述 VK1650是一种带键盘扫描电路接口的 LED 驱动控制专用芯片&#xff0c;内部集成有数据锁存器、LED 驱动、键盘扫描等电路。…