python 实现dijkstra迪杰斯特拉算法

news/2024/10/11 5:22:00/

dijkstra迪杰斯特拉算法介绍

Dijkstra(迪杰斯特拉)算法是由荷兰计算机科学家狄克斯特拉于1959年提出的,它是一种用于计算图中一个节点到其他所有节点的最短路径的算法。该算法主要用于解决有权图(即图中的边有权值)中的最短路径问题,但不能直接用于求解图中任意两点间的最短路径,而是从一个源点出发,计算该源点到其他所有点的最短路径。

算法的基本原理

Dijkstra算法采用贪心策略,从起始点开始,逐步寻找最短路径,直至到达所有顶点。具体步骤如下:

初始化:

设定两个集合:S(已求出最短路径的顶点集合)和U(未求出最短路径的顶点集合)。
将起始点加入S,U中包括除起始点外的所有顶点。如果某顶点与起始点不相邻,则设置其距离为无穷大。

循环过程:

在U中选择距离起始点最近的顶点K,将其从U移到S中。
更新U中所有顶点到起始点的距离,通过检查是否可以通过顶点K来缩短这些距离。
重复上述步骤,直到U为空,即所有顶点都被加入到S中。

算法特点

贪心策略:每次从未确定最短路径的顶点中选择距离最小的顶点,更新其他顶点的最短路径。
广度优先遍历思想:以起始点为中心向外层层扩展,直到扩展到所有顶点。
适用于带权图:要求图中路径的权值不能为负。

应用场景

Dijkstra算法在处理带权值的具体实例中非常有用,如计算一个城市内各个乡镇到某一特定乡镇的最短路径。在现实生活中,该算法广泛应用于地图导航、网络路由选择、交通规划等领域。

请注意,虽然Dijkstra算法在处理单源最短路径问题时非常有效,但在处理大型图或需要频繁查询不同源点间的最短路径时,可能需要考虑更高效的算法或数据结构。

python_29">dijkstra迪杰斯特拉算法python实现样例

以下是用 Python 实现迪杰斯特拉算法的示例代码:

python">import heapqdef dijkstra(graph, source):# 初始化距离字典和已访问节点集合dist = {node: float('inf') for node in graph}dist[source] = 0visited = set()# 使用优先队列存储距离和节点pq = [(0, source)]while pq:# 弹出距离最小的节点current_dist, current_node = heapq.heappop(pq)# 如果当前节点已访问,继续下一次循环if current_node in visited:continue# 更新当前节点的邻居节点的最短距离for neighbor, weight in graph[current_node].items():distance = current_dist + weightif distance < dist[neighbor]:dist[neighbor] = distanceheapq.heappush(pq, (distance, neighbor))# 将当前节点标记为已访问visited.add(current_node)return dist# 示例图的邻接矩阵表示
graph = {'A': {'B': 6, 'C': 3},'B': {'A': 6, 'C': 2, 'D': 5},'C': {'A': 3, 'B': 2, 'D': 3, 'E': 4},'D': {'B': 5, 'C': 3, 'E': 2, 'F': 3},'E': {'C': 4, 'D': 2, 'F': 5},'F': {'D': 3, 'E': 5}
}source = 'A'
distances = dijkstra(graph, source)
print(distances)

运行以上代码将会输出源节点 ‘A’ 到其他节点的最短距离,示例图的输出结果如下:

{'A': 0, 'B': 5, 'C': 3, 'D': 6, 'E': 7, 'F': 9}

其中,键表示节点,值表示源节点到该节点的最短距离。


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

相关文章

JVM有哪些参数以及如何使用

JVM&#xff08;Java虚拟机&#xff09;参数用于调整和优化Java应用程序的性能和行为。这些参数主要分为标准参数、非标准参数&#xff08;以-X开头&#xff09;和高级参数&#xff08;以-XX开头&#xff09;。以下是一些常见的JVM参数及其使用方法&#xff1a; 标准参数 -se…

基于单片机的山林远程环境监测仪设计

本设计基于单片机的智能化的远程山林环境检测仪&#xff0c;该检测仪由硬件系统和软件系统构成。电源管理模块给整个硬件系统提供工作所需电源&#xff0c;系统可完成山林环境有关的温度、湿度、火焰和海拔高度的采集&#xff0c;并且可通过与按键设置阈值作对比判断危险情况&a…

数学基础 -- 微积分之链式求导法则

链式求导法则 链式求导法则&#xff08;Chain Rule&#xff09;是微积分中非常重要的法则&#xff0c;用于计算复合函数的导数。其基本思想是&#xff1a;如果一个变量依赖于另一个变量&#xff0c;而这个中间变量又依赖于另一个变量&#xff0c;那么可以通过链式法则把这些依…

第 17 场小白入门赛蓝桥杯

第 17 场小白入门赛 2 北伐军费 发现每次选大的更优&#xff0c;所以可以排序之后&#xff0c;先手取右边&#xff0c;后手取左边。 实际发现&#xff0c;对于 A − B A-B A−B 的结果来说&#xff0c;后手对于这个式子的贡献是 − − a i --a_i −−ai​ &#xff0c;也就…

使用 Go 和 Gin 框架构建简单的用户和物品管理 Web 服务

使用 Go 和 Gin 框架构建简单的用户和物品管理 Web 服务 在本项目中&#xff0c;我们使用 Go 语言和 Gin 框架构建了一个简单的 Web 服务&#xff0c;能够管理用户和物品的信息。该服务实现了两个主要接口&#xff1a;根据用户 ID 获取用户名称&#xff0c;以及根据物品 ID 获…

多jdk版本环境下,jenkins系统设置需指定JAVA_HOME环境变量

一、背景 由于不同项目对jdk版本的要求不同&#xff0c;有些是要求jdk11&#xff0c;有些只需要jdk8即可。 而linux机器上安装jdk的方式又多种多样&#xff0c;最后导致jenkins打包到底使用的是哪个jdk&#xff0c;比较混乱。 1、java在哪 > whereis java java: /usr/bin/…

【自注意力与Transformer架构在自然语言处理中的演变与应用】

背景介绍 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;序列到序列&#xff08;seq2seq&#xff09;模型和Transformer架构的出现&#xff0c;极大地推动了机器翻译、文本生成和其他语言任务的进展。传统的seq2seq模型通常依赖于循环神经网络&#xff08;RNN&…

浅聊前后端分离开发和前后端不分离开发模式

1.先聊聊Web开发的开发框架Spring MVC 首先要知道&#xff0c;Spring MVC是Web开发领域的一个知名框架&#xff0c;可以开发基于请求-响应模式的Web应用。而Web开发的本质是遵循HTTP&#xff08;Hyper Text Transfer Protocol: 超文本传输协议&#xff09;协议【发请求&#xf…