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 heapq

def dijkstra(graph, start):
    # 初始化
    shortest_paths = {node: float('inf') for node in graph}
    shortest_paths[start] = 0
    priority_queue = [(0, start)]
    visited = set()

    while priority_queue:
        (current_distance, current_node) = heapq.heappop(priority_queue)
        if current_node in visited:
            continue
        visited.add(current_node)

        for neighbor, weight in graph[current_node].items():
            distance = current_distance + weight
            if distance < shortest_paths[neighbor]:
                shortest_paths[neighbor] = distance
                heapq.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.mfbz.cn/a/632974.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言 数组——向函数传递数组

目录 把数组传给函数&#xff08;Passing Arrays to Functions&#xff09; 向函数传递一维数组 向函数传递二维数组 数组在学生成绩管理中的应用 例&#xff1a;计算每个学生的平均分 把数组传给函数&#xff08;Passing Arrays to Functions&#xff09; 向函数传递一维…

校园霸凌行为监测AI预警系统

校园霸凌行为监测AI预警系统基于AI视觉智能分析算法&#xff0c;校园霸凌行为监测AI预警系统通过已安装的监控摄像头对校园现场画面进行实时监测。校园霸凌行为监测AI预警系统能够自动识别学生的违规行为&#xff0c;包括打架、跌倒、偷偷翻墙、人员聚众、攀高、抽烟等行为&…

【C++】右值引用 移动语义

目录 前言一、右值引用与移动语义1.1 左值引用和右值引用1.2 右值引用使用场景和意义1.3 右值引用引用左值及其一些更深入的使用场景分析1.3.1 完美转发 二、新的类功能三、可变参数模板 前言 本篇文章我们继续来聊聊C11新增的一些语法——右值引用&#xff0c;我们在之前就已…

马蹄集 oj赛(双周赛第二十七次)

目录 栈的min 外卖递送 奇偶序列 sort 五彩斑斓的世界 括号家族 名次并列 栈间 双端队列 合并货物 逆序对 活动分组 栈的min 难度:黄金巴 占用内存:128 M时间限制:1秒 小码哥又被安排任务了&#xff0c;这次他需要要设计一个堆栈&#xff0c;他除了可以满足正常的栈…

Spring Security整合Gitee第三方登录

文章目录 学习链接环境准备1. 搭建基本web应用引入依赖ThirdApp启动类创建index页面application.yml配置访问测试 2. 引入security引入依赖ProjectConfig访问测试 第三方认证简介注册gitee客户端实现1引入依赖application.yml配置文件创建index.html页面启动类InfoControllerPr…

【openlayers系统学习】3.4波段数学计算(计算NDVI)

四、波段数学计算&#xff08;计算NDVI&#xff09; 我们已经看到了如何使用 ol/source/GeoTIFF​ 源代码来渲染真彩色和假彩色合成。我们通过将缩放的反射率值直接渲染到红色、绿色或蓝色显示通道中的一个来实现这一点。还可以对来自GeoTIFF&#xff08;或其他数据瓦片源&…

javaSwing购物系统项目(文档+视频+源码)

摘要 由Java swing实现的一款简单的购物程序&#xff0c;数据库采用的是mysql&#xff0c;该项目非常简单&#xff0c;实现了管理员对商品类型和商品的管理及用户注册登录后浏览商品、加入购物车、购买商品等功能&#xff0c;旨在学习Java 图形界面开发 系统实现 我们先来管理…

20240516-Flyme AIOS 特种兵发布会

目录 1 Flyme AIOS 2 路演功能 2.1 拖拽流转 2.2 任务剧本自定义 2.3 智能体商店 2.4 实况通知 2.5 AI壁纸 3 MYVU 3.1 翻译功能 3.2 AR导航-骑行 3.3 AI语音转文字-科技向善 3.4 Flyme AR-提词器增强 1 Flyme AIOS 1&#xff09;目标&#xff1a;All in AI&#…

Android:OkHttp网络请求框架的使用

目录 一&#xff0c;OkHttp简介 二&#xff0c;OkHttp请求处理流程 三&#xff0c;OkHttp环境配置 四&#xff0c;OkHttp的使用 1.get网络请求 2.post上传表单数据 3.post上传json格式数据 4.文件上传 5.文件下载 一&#xff0c;OkHttp简介 OkHttp是square公司推出的一…

淘宝api接口是什么意思?api接口申请资格是什么?

淘宝其开放性和灵活性为开发者提供了广阔的创新空间。而淘宝API接口&#xff0c;作为连接淘宝平台与外部应用的桥梁&#xff0c;发挥着至关重要的作用。那么&#xff0c;淘宝api接口是什么意思&#xff1f; 一、淘宝API接口是什么意思&#xff1f; 淘宝API接口&#xff0c;全称…

UNI-APP设置屏幕保持常亮-不熄灭屏幕

前言 最近在实际开发过程中&#xff0c;我们会发现在自己使用的app当中会根据系统无操作熄灭屏幕对于一下需要长时间保持屏幕的业务就很不友好&#xff0c;uni-app也是提供了相应方法加上代码之后-注意app端没报错-不生效就是权限问题-需要设置相对应权限-打自定义包 代码实现…

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版本以上频繁点击菜单报错…

【编译原理复习笔记】语法分析-补充(二义性与LR错误处理)

二义性文法的 LR 分析 每个二义性文法都不是 LR 的 但是某些二义性文法更加简短&#xff0c;描述更方便 如 I7 和 I8 具有移进归约冲突 使用优先级和结合性解决冲突 对于 I7&#xff0c;由于乘号优先级高于加号&#xff0c;所以当下一个输入符号为乘号时&#xff0c;我们优…

03-02-Vue组件之间的传值

前言 我们接着上一篇文章 03-01-Vue组件的定义和注册 来讲。 下一篇文章 04-Vue&#xff1a;ref获取页面节点–很简单 父组件向子组件传值 我们可以这样理解&#xff1a;Vue实例就是一个父组件&#xff0c;而我们自定义的组件&#xff08;包括全局组件、私有组件&#xff09;…

Java基础入门day49

day49 tomcat 启动 进入tomcat的bin目录&#xff0c;双击或者运行startup.bat文件启动tomcat 控制台最后出现服务器启动在多少毫米之内&#xff0c;代表服务器成功启动 org.apache.catalina.startup.Catalina.start Server startup in 405 ms 验证tomcat 在浏览器中输入 loca…

linux---进程通信

提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、匿名管道 进程之间的通信目的一般是来控制另一个进程。也可以用来实现数据的交流&#xff0c;还有资源共享等。 匿名管道原理&#xff1a; &#xff08;铺垫&#xff09;进程之间是具有独立性&…

超市进销存|基于SprinBoot+vue的超市进销存系统(源码+数据库+文档)

超市进销存系统 目录 基于SprinBootvue的超市进销存系统 一、前言 二、系统设计 三、系统功能设计 1 登录注册 2 管理员功能模块 3员工功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#x…

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

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

桂林电子科技大学计算机工程学院、广西北部湾大学计信学院莅临泰迪智能科技参观交流

5月18日&#xff0c;桂林电子科技大学计算机工程学院副院长刘利民、副书记杨美娜、毕业班辅导员黄秀娟、广西北部湾大学计信学院院长助理刘秀平莅临广东泰迪智能科技股份有限公司产教融合实训基地参观交流。泰迪智能科技副总经理施兴、广西分公司郑廷和、梁霜、培训业务部孙学镂…