网站首页 > 技术文章 正文
大家好!我是幻化意识流。
今天我们用Python写一个图算法之最短路径算法的代码,我做了注释说明,欢迎大家一起学习:
以下是Dijkstra 最短路径算法的 Python实现,我们将使用邻接矩阵表示图。
请看代码:
import sys
class Graph():
def __init__(self, vertices):
self.V = vertices
self.graph = [[0 for column in range(vertices)] for row in range(vertices)]
def printSolution(self, dist):
print("Vertex \t Distance from Source")
for node in range(self.V):
print(node, "\t\t", dist[node])
def minDistance(self, dist, sptSet):
min_dist = sys.maxsize
for v in range(self.V):
if dist[v] < min_dist and sptSet[v] == False:
min_dist = dist[v]
min_index = v
return min_index
def dijkstra(self, src):
dist = [sys.maxsize] * self.V
dist[src] = 0
sptSet = [False] * self.V
for i in range(self.V):
u = self.minDistance(dist, sptSet)
sptSet[u] = True
for v in range(self.V):
if self.graph[u][v] > 0 and sptSet[v] == False and dist[v] > dist[u] + self.graph[u][v]:
dist[v] = dist[u] + self.graph[u][v]
self.printSolution(dist)
代码解释:
这段代码实现了Dijkstra算法,用于求解从给定源节点到其他节点的最短路径。
在类定义中,有三个主要的方法:
- __init__(self, vertices) - 初始化图的构造函数,它创建一个空图,其中顶点数由参数vertices确定。
- printSolution(self, dist) - 该方法用于打印从源节点到每个节点的最短路径距离。
- dijkstra(self, src) - 这是Dijkstra算法的主要实现。该函数接受源节点的索引作为输入,并返回从该节点到其他节点的最短路径距离。
其中,minDistance(self, dist, sptSet)是Dijkstra算法的关键步骤。它在尚未包含在最短路径树(sptSet)中的节点中选择具有最小距离值的节点,并返回其索引。
在dijkstra函数中,首先将源节点的距离值设为0,然后遍历所有节点。在每次迭代中,找到距离源节点最近的节点(即最小距离节点),将其添加到最短路径树中,并更新与该节点相邻的所有节点的距离值。如果找到更短的路径,则将其更新为更短的路径。当遍历所有节点时,输出源节点到每个节点的最短路径距离。
此外,这个类还有一个二维数组(graph)用于存储节点之间的边和权重。如果节点u和v之间存在边,则在graph[u][v]中存储其权重。如果没有边,则在此位置存储0。
我们再详细解释一下具体实现步骤:
- 在__init__函数中,创建一个二维数组(graph)来表示图中节点之间的边和权重。它的大小为 vertices x vertices,其中vertices是给定的节点数。最初,所有元素都被初始化为0,表示图中没有边。
- 在minDistance函数中,找到距离源节点最近的节点(即最小距离节点),并返回其索引。该函数接受两个参数:dist和sptSet。dist是一个数组,用于存储从源节点到每个节点的距离。sptSet是一个布尔数组,用于跟踪哪些节点包含在最短路径树中。
- 在dijkstra函数中,首先将源节点的距离值设为0,将sptSet数组初始化为False,表示所有节点都尚未包含在最短路径树中。
- 然后,在for循环中,迭代V次,每次找到距离源节点最近的节点,并将其添加到最短路径树中(将其对应的sptSet元素设置为True)。接下来,遍历与该节点相邻的所有节点。如果该节点尚未包含在最短路径树中,且通过该节点到达该节点的距离比当前存储的距离更短,则将其更新为更短的距离。
- 最后,在printSolution函数中,打印每个节点的距离值,即从源节点到该节点的最短路径距离。
总体来说,这段代码实现了Dijkstra算法的核心步骤,即找到从源节点到其他节点的最短路径。它使用了一个二维数组来表示图中的节点之间的边和权重,并使用一个数组(dist)来跟踪从源节点到每个节点的最短距离。在每次迭代中,它找到距离源节点最近的节点,并更新与该节点相邻的节点的距离值。当所有节点都被遍历后,它打印源节点到每个节点的最短距离。
如果喜欢我的文章,麻烦您动动您的神手帮我点个赞哦!本人在此深深的感谢!
猜你喜欢
- 2025-05-09 Python基础教程——列表(一)(python列表编程)
- 2025-05-09 Python学习笔记第一篇(2021年12月14日)——图像的位深度
- 2025-05-09 一文搞懂Python中的import与目录层级
- 2025-05-09 Introduction to Python Lists 列表介绍
- 2025-05-09 Python 列表(List)详解(python列表讲解)
- 2025-05-09 详解Python 基础知识(python 基础 详细)
- 2025-05-09 python海龟绘图turtle(一):画布和窗体
- 2025-05-09 Python使用bokeh及folium实现地理位置信息的交互可视化
- 2025-05-09 Python高手进阶:深入os.path模块高效处理路径问题
- 2025-05-09 Python 实现【找出经过特定点的路径长度】
- 06-24Python调用Docker API的使用方式(pycharm docker 调试)
- 06-24青少年Python编程系列28:Python中函数的递归调用
- 06-24python调用sqlite数据库案例(python 调用数据库)
- 06-24【Python机器学习系列】基于Flask来构建API调用机器学习模型服务
- 06-24通过pybind11来实现python调用C++接口(一)
- 06-24Python编程调用Deepseek API创建智能体
- 06-24python多装饰器针对函数、类、方法的调用顺序说明
- 06-24Python Qt GUI设计:Python调用UI文件的两种方法(基础篇—3)
- 270℃Python短文,Python中的嵌套条件语句(六)
- 268℃python笔记:for循环嵌套。end=""的作用,图形打印
- 266℃PythonNet:实现Python与.Net代码相互调用!
- 262℃Python实现字符串小写转大写并写入文件
- 261℃Python操作Sqlserver数据库(多库同时异步执行:增删改查)
- 121℃原来2025是完美的平方年,一起探索六种平方的算吧
- 102℃Python 和 JavaScript 终于联姻了!PythonMonkey 要火?
- 96℃Ollama v0.4.5-v0.4.7 更新集合:Ollama Python 库改进、新模型支持
- 最近发表
-
- Python调用Docker API的使用方式(pycharm docker 调试)
- 青少年Python编程系列28:Python中函数的递归调用
- python调用sqlite数据库案例(python 调用数据库)
- 【Python机器学习系列】基于Flask来构建API调用机器学习模型服务
- 通过pybind11来实现python调用C++接口(一)
- Python编程调用Deepseek API创建智能体
- python多装饰器针对函数、类、方法的调用顺序说明
- Python Qt GUI设计:Python调用UI文件的两种方法(基础篇—3)
- Python | Django 外部脚本调用 models 数据库
- 自学Python第九天——操作列表(python操作步骤)
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)