使用 Python 实现 Dijkstra 算法

news/2024/11/30 18:03:38/

目录

使用 Python 实现 Dijkstra 算法

1. Dijkstra 算法的基本概念

2. 工作原理

3. Python 实现

图的表示

Dijkstra 算法实现

4. 代码详解

初始化

主循环

返回结果

5. 总结


使用 Python 实现 Dijkstra 算法

Dijkstra 算法是一种用于解决图中单源最短路径问题的经典算法。它由荷兰计算机科学家 Edsger W. Dijkstra 于 1956 年提出。本文将详细介绍 Dijkstra 算法的基本概念、工作原理,并提供一个使用 Python 实现的示例。

1. Dijkstra 算法的基本概念

Dijkstra 算法用于在一个带权重的图中找到从一个起点到其他所有顶点的最短路径。算法的主要思想是从起点开始,逐步扩展已知最短路径的顶点集合,直到所有顶点都被包含在内。

2. 工作原理
  1. 初始化:将起点的距离设为 0,其他所有顶点的距离设为无穷大(表示未知)。
  2. 选择最小距离顶点:从未被处理的顶点中选择距离最小的顶点。
  3. 更新邻接顶点的距离:对于选定的顶点,更新其所有邻接顶点的距离。
  4. 标记顶点为已处理:将选定的顶点标记为已处理。
  5. 重复步骤 2-4:直到所有顶点都被处理完毕。
3. Python 实现

下面是一个使用 Python 实现 Dijkstra 算法的示例。我们将使用一个简单的图来演示算法的工作过程。

图的表示

我们将使用邻接表来表示图。邻接表是一个字典,其中键是顶点,值是一个包含相邻顶点及其权重的列表。

graph = {'A': {'B': 1, 'C': 4},'B': {'A': 1, 'C': 2, 'D': 5},'C': {'A': 4, 'B': 2, 'D': 1},'D': {'B': 5, 'C': 1}
}
Dijkstra 算法实现
import heapqdef dijkstra(graph, start):# 初始化距离字典,所有顶点的距离初始为无穷大distances = {vertex: float('infinity') for vertex in graph}distances[start] = 0# 初始化优先队列,存储 (距离, 顶点) 对priority_queue = [(0, start)]while priority_queue:# 弹出距离最小的顶点current_distance, current_vertex = heapq.heappop(priority_queue)# 如果当前距离大于已知最短距离,跳过if current_distance > distances[current_vertex]:continue# 更新邻接顶点的距离for neighbor, weight in graph[current_vertex].items():distance = current_distance + weight# 如果找到更短的路径,更新距离并加入优先队列if distance < distances[neighbor]:distances[neighbor] = distanceheapq.heappush(priority_queue, (distance, neighbor))return distances# 示例图
graph = {'A': {'B': 1, 'C': 4},'B': {'A': 1, 'C': 2, 'D': 5},'C': {'A': 4, 'B': 2, 'D': 1},'D': {'B': 5, 'C': 1}
}# 起点
start_vertex = 'A'# 计算最短路径
shortest_distances = dijkstra(graph, start_vertex)
print(shortest_distances)  # 输出 {'A': 0, 'B': 1, 'C': 3, 'D': 4}
4. 代码详解
初始化
  • 距离字典distances 字典用于存储每个顶点的最短距离,初始时所有顶点的距离为无穷大,起点的距离为 0。
  • 优先队列priority_queue 是一个最小堆,用于存储待处理的顶点及其距离。
distances = {vertex: float('infinity') for vertex in graph}
distances[start] = 0
priority_queue = [(0, start)]
主循环
  • 弹出距离最小的顶点:使用 heapq.heappop 从优先队列中弹出距离最小的顶点。
  • 跳过已处理的顶点:如果当前顶点的距离大于已知最短距离,跳过该顶点。
  • 更新邻接顶点的距离:对于当前顶点的每个邻接顶点,计算新的距离,如果新的距离更短,则更新距离并将其加入优先队列。
while priority_queue:current_distance, current_vertex = heapq.heappop(priority_queue)if current_distance > distances[current_vertex]:continuefor neighbor, weight in graph[current_vertex].items():distance = current_distance + weightif distance < distances[neighbor]:distances[neighbor] = distanceheapq.heappush(priority_queue, (distance, neighbor))
返回结果

最后,返回 distances 字典,其中包含从起点到每个顶点的最短距离。

return distances
5. 总结

Dijkstra 算法是一种经典的最短路径算法,适用于带权重的图。


http://www.ppmy.cn/news/1551265.html

相关文章

CSS:Web美学的革新之旅

自HTML的诞生之日起&#xff0c;Web页面设计便踏上了一段不断进化的旅程。起初&#xff0c;HTML作为构建网页的骨架&#xff0c;仅承载着最基本的文本结构与少量显示属性。然而&#xff0c;随着互联网的蓬勃发展和用户对视觉体验需求的日益增长&#xff0c;HTML开始不堪重负&am…

JSON格式

JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和生成。它基于JavaScript的一个子集&#xff0c;但是JSON是独立于语言的文本格式&#xff0c;许多编程语言都支持JSON格式的数…

过滤条件包含 OR 谓词,如何进行查询优化——OceanBase SQL 优化实践

这篇博客涉及两个点&#xff0c;一个是 “OR Expansion 改写”&#xff0c;另一个是 “基于代价的改写”。 背景 在写SQL查询时&#xff0c;难以避免在过滤条件中使用 OR 谓词&#xff0c;但其往往会导致索引利用效率下降的问题 。本文将分享如何通过查询改写的2种方式进行优化…

合规性要求对漏洞管理策略的影响

讨论漏洞管理中持续面临的挑战&#xff0c;包括确定漏洞的优先级和解决修补延迟问题。 介绍合规性要求以及自动化如何简化漏洞管理流程。 您认为为什么尽管技术不断进步&#xff0c;但优先考虑漏洞和修补延迟等挑战仍然存在&#xff1f; 企业基础设施日益复杂&#xff0c;攻…

JS怎么实现Module模块化?

在JavaScript中实现模块化主要有两种方式&#xff1a;CommonJS和ES6模块。以下是这两种方法的基本实现&#xff1a; CommonJS CommonJS是Node.js的原生模块系统&#xff0c;但它也可以在浏览器环境中使用通过构建工具如Webpack或Browserify。 模块导出&#xff1a; // myMod…

Qt中QSpinBox valueChanged 信号触发两次

Qt中QSpinBox valueChanged 信号触发两次 如果使用鼠标调整&#xff0c;这个信号则会被触发两次如果使用键盘输入&#xff0c;则会触发一次 connect(ui->spinBox_rows, SIGNAL(valueChanged(int)), this, SLOT(test()));https://blog.csdn.net/dododododoooo/article/deta…

SpringMVC(1)

前言 1. SpringMVC简介 2. 入门案例 第一步导入坐标&#xff0c;SpringMVC和servlet 这样其实就把我们要用的Spring相关的都用上了 第三步就是加载这个bean 写配置类 第四步做一个Tomcat容器启动的配置 还要加上Tomcat插件 我们在创建一个快捷方式 注意由于我的JDK版本高…

【经典论文阅读】Transformer(多头注意力 编码器-解码器)

Transformer attention is all you need 摘要 完全舍弃循环 recurrence 和卷积 convolutions 只依赖于attention mechanisms 【1】Introduction 完全通过注意力机制&#xff0c;draw global dependencies between input and output 【2】Background 1&#xff1a;self-…