dijkstra迪杰斯特算法邻接表加二叉堆实现python版

2024-01-10 05:59

本文主要是介绍dijkstra迪杰斯特算法邻接表加二叉堆实现python版,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

dijkstra迪杰斯特算法

需要知道的点:
1、属于贪心算法
2、得到一点到其他各点的所有距离
3、需要用到所有的信息
4、图中不能有负数权重

dijkstra算法过程

今天不是铅笔加手写
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

python+优先队列实现(这里用的二叉堆)

def showGraph(linkList):for vert in linkList:for n in vert.getNeighbor():print("%s---邻接---%s--权重:%s"%(vert.getValue(),n,vert.getWightTo(n)))
class vertix:def __init__(self,v):self.value=vself.neighbor={}self.D=float("inf")def getValue(self):return  self.valuedef getNeighbor(self):return self.neighbor.keys()def addNeighbor(self,v,w):self.neighbor[v]=wdef getWightTo(self,v):return self.neighbor[v]def getD(self):return self.Ddef setD(self,newD):self.D=newDimport heapq
class dijkstra:def __init__(self,gragh):self.gragh=graghdef getMinPath(self,start):for i,node in enumerate(self.gragh):node.setD(2**32+i)self.gragh[start].setD(0)#创建二叉堆mydata=[[node.getD(),node.getValue()] for node in self.gragh]heapq.heapify(mydata)#优先队列中以D为键建立优先级while mydata:key,thisIndex=heapq.heappop(mydata)thisNode=self.gragh[thisIndex]for neibor in self.gragh[thisIndex].getNeighbor():self.gragh[neibor].setD(min(self.gragh[neibor].getD(),thisNode.getD()+thisNode.getWightTo(neibor)))tempData=[]for node in mydata:tempVer=self.gragh[node[1]]heapq.heappush(tempData,[tempVer.getD(),tempVer.getValue()])mydata=tempDatares=[]for ver in self.gragh:res.append(ver.getD())return resif __name__ == '__main__':    inputData=[[(1,12),(5,16),(6,14)],[(0,12),(2,10),(5,7)],[(1,10),(3,3),(4,5),(5,6)],[(2,3),(4,4)],[(2,5),(3,4),(5,2),(6,8)],[(0,16),(1,7),(2,6),(4,2),(6,9)],[(0,14),(4,8),(5,9)]] #构造邻接表linkList=[]for i in range(len(inputData)):thisVerix=vertix(i)for v,w in inputData[i]:thisVerix.addNeighbor(v,w)linkList.append(thisVerix)showGraph(linkList)myDijstrs=dijkstra(linkList)print("最终结果------->")print(myDijstrs.getMinPath(0))

运行结果

0---邻接---1--权重:12
0---邻接---5--权重:16
0---邻接---6--权重:14
1---邻接---0--权重:12
1---邻接---2--权重:10
1---邻接---5--权重:7
2---邻接---1--权重:10
2---邻接---3--权重:3
2---邻接---4--权重:5
2---邻接---5--权重:6
3---邻接---2--权重:3
3---邻接---4--权重:4
4---邻接---2--权重:5
4---邻接---3--权重:4
4---邻接---5--权重:2
4---邻接---6--权重:8
5---邻接---0--权重:16
5---邻接---1--权重:7
5---邻接---2--权重:6
5---邻接---4--权重:2
5---邻接---6--权重:9
6---邻接---0--权重:14
6---邻接---4--权重:8
6---邻接---5--权重:9
最终结果------->
[0, 12, 22, 22, 18, 16, 14]

这篇关于dijkstra迪杰斯特算法邻接表加二叉堆实现python版的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/589789

相关文章

Spring Retry 实现乐观锁重试实践记录

《SpringRetry实现乐观锁重试实践记录》本文介绍了在秒杀商品SKU表中使用乐观锁和MybatisPlus配置乐观锁的方法,并分析了测试环境和生产环境的隔离级别对乐观锁的影响,通过简单验证,... 目录一、场景分析 二、简单验证 2.1、可重复读 2.2、读已提交 三、最佳实践 3.1、配置重试模板

Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)

《Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)》文章介绍了如何使用dhtmlx-gantt组件来实现公司的甘特图需求,并提供了一个简单的Vue组件示例,文章还分享了一... 目录一、首先 npm 安装插件二、创建一个vue组件三、业务页面内 引用自定义组件:四、dhtmlx

使用Python创建一个能够筛选文件的PDF合并工具

《使用Python创建一个能够筛选文件的PDF合并工具》这篇文章主要为大家详细介绍了如何使用Python创建一个能够筛选文件的PDF合并工具,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录背景主要功能全部代码代码解析1. 初始化 wx.Frame 窗口2. 创建工具栏3. 创建布局和界面控件4

一文详解如何在Python中使用Requests库

《一文详解如何在Python中使用Requests库》:本文主要介绍如何在Python中使用Requests库的相关资料,Requests库是Python中常用的第三方库,用于简化HTTP请求的发... 目录前言1. 安装Requests库2. 发起GET请求3. 发送带有查询参数的GET请求4. 发起PO

Python与DeepSeek的深度融合实战

《Python与DeepSeek的深度融合实战》Python作为最受欢迎的编程语言之一,以其简洁易读的语法、丰富的库和广泛的应用场景,成为了无数开发者的首选,而DeepSeek,作为人工智能领域的新星... 目录一、python与DeepSeek的结合优势二、模型训练1. 数据准备2. 模型架构与参数设置3

Python进行PDF文件拆分的示例详解

《Python进行PDF文件拆分的示例详解》在日常生活中,我们常常会遇到大型的PDF文件,难以发送,将PDF拆分成多个小文件是一个实用的解决方案,下面我们就来看看如何使用Python实现PDF文件拆分... 目录使用工具将PDF按页数拆分将PDF的每一页拆分为单独的文件将PDF按指定页数拆分根据页码范围拆分

Vue ElementUI中Upload组件批量上传的实现代码

《VueElementUI中Upload组件批量上传的实现代码》ElementUI中Upload组件批量上传通过获取upload组件的DOM、文件、上传地址和数据,封装uploadFiles方法,使... ElementUI中Upload组件如何批量上传首先就是upload组件 <el-upl

Docker部署Jenkins持续集成(CI)工具的实现

《Docker部署Jenkins持续集成(CI)工具的实现》Jenkins是一个流行的开源自动化工具,广泛应用于持续集成(CI)和持续交付(CD)的环境中,本文介绍了使用Docker部署Jenkins... 目录前言一、准备工作二、设置变量和目录结构三、配置 docker 权限和网络四、启动 Jenkins

Python3脚本实现Excel与TXT的智能转换

《Python3脚本实现Excel与TXT的智能转换》在数据处理的日常工作中,我们经常需要将Excel中的结构化数据转换为其他格式,本文将使用Python3实现Excel与TXT的智能转换,需要的可以... 目录场景应用:为什么需要这种转换技术解析:代码实现详解核心代码展示改进点说明实战演练:从Excel到

Python中常用的四种取整方式分享

《Python中常用的四种取整方式分享》在数据处理和数值计算中,取整操作是非常常见的需求,Python提供了多种取整方式,本文为大家整理了四种常用的方法,希望对大家有所帮助... 目录引言向零取整(Truncate)向下取整(Floor)向上取整(Ceil)四舍五入(Round)四种取整方式的对比综合示例应