python实现dijkstra最短路由算法


Posted in Python onJanuary 17, 2019

Dijkstra算法:又称迪杰斯特拉算法,迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止百度百科。

注意:Dijkstra算法不能处理包含负边的图

# dijkstra算法实现,有向图和路由的源点作为函数的输入,最短路径最为输出
def dijkstra(graph,src):
 # 判断图是否为空,如果为空直接退出
 if graph is None:
 return None
 nodes = [i for i in range(len(graph))] # 获取图中所有节点
 visited=[] # 表示已经路由到最短路径的节点集合
 if src in nodes:
 visited.append(src)
 nodes.remove(src)
 else:
 return None
 distance={src:0} # 记录源节点到各个节点的距离
 for i in nodes:
 distance[i]=graph[src][i] # 初始化
 # print(distance)
 path={src:{src:[]}} # 记录源节点到每个节点的路径
 k=pre=src
 while nodes:
 mid_distance=float('inf')
 for v in visited:
  for d in nodes:
  new_distance = graph[src][v]+graph[v][d]
  if new_distance < mid_distance:
   mid_distance=new_distance
   graph[src][d]=new_distance # 进行距离更新
   k=d
   pre=v
 distance[k]=mid_distance # 最短路径
 path[src][k]=[i for i in path[src][pre]]
 path[src][k].append(k)
 # 更新两个节点集合
 visited.append(k)
 nodes.remove(k)
 print(visited,nodes) # 输出节点的添加过程
 return distance,path
if __name__ == '__main__':
 graph_list = [ [0, 2, 1, 4, 5, 1],
  [1, 0, 4, 2, 3, 4],
  [2, 1, 0, 1, 2, 4],
  [3, 5, 2, 0, 3, 3],
  [2, 4, 3, 4, 0, 1],
  [3, 4, 7, 3, 1, 0]]

 distance,path= dijkstra(graph_list, 0) # 查找从源点0开始带其他节点的最短路径
 print(distance,path)

节点的遍历过程如下:

python实现dijkstra最短路由算法

最短路径输出:

python实现dijkstra最短路由算法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python学习之asyncore模块用法实例教程
Sep 29 Python
python判断字符串是否包含子字符串的方法
Mar 24 Python
Python中的anydbm模版和shelve模版使用指南
Jul 09 Python
python的文件操作方法汇总
Nov 10 Python
利用信号如何监控Django模型对象字段值的变化详解
Nov 27 Python
在Python中字典根据多项规则排序的方法
Jan 21 Python
python 将有序数组转换为二叉树的方法
Mar 26 Python
解决webdriver.Chrome()报错:Message:'chromedriver' executable needs to be in Path
Jun 12 Python
python画双y轴图像的示例代码
Jul 07 Python
python小程序之4名牌手洗牌发牌问题解析
May 15 Python
python让函数不返回结果的方法
Jun 22 Python
学习Python需要哪些工具
Sep 04 Python
Pycharm 设置默认头的图文教程
Jan 17 #Python
python实现狄克斯特拉算法
Jan 17 #Python
在PyCharm下使用 ipython 交互式编程的方法
Jan 17 #Python
python最小生成树kruskal与prim算法详解
Jan 17 #Python
解决PyCharm不运行脚本,而是运行单元测试的问题
Jan 17 #Python
在PyCharm导航区中打开多个Project的关闭方法
Jan 17 #Python
Python设计模式之模板方法模式实例详解
Jan 17 #Python
You might like
把PHP安装为Apache DSO
2006/10/09 PHP
Mysql和网页显示乱码解决方法集锦
2008/03/27 PHP
php数组函数序列之in_array() 查找数组值是否存在
2011/10/29 PHP
PHP读取大文件的几种方法介绍
2016/10/27 PHP
Yii支持多域名cors原理的实现
2018/12/05 PHP
alixixi runcode.asp的代码不错的应用
2007/08/08 Javascript
javascript中的undefined和not defined区别示例介绍
2014/02/26 Javascript
JavaScript基础函数整理汇总
2015/01/30 Javascript
JS获取数组最大值、最小值及长度的方法
2015/11/24 Javascript
jQuery遍历节点树方法分析
2016/09/08 Javascript
JavaScript版经典游戏之扫雷游戏完整示例【附demo源码下载】
2016/12/12 Javascript
JavaScript轻松创建级联函数的方法示例
2017/02/10 Javascript
如何去除vue项目中的#及其ie9兼容性
2018/01/11 Javascript
使用express搭建一个简单的查询服务器的方法
2018/02/09 Javascript
vee-validate vue 2.0自定义表单验证的实例
2018/08/28 Javascript
jquery.tagsinput.js实现记录checkbox勾选的顺序
2019/09/21 jQuery
在vue中使用Echarts利用watch做动态数据渲染操作
2020/07/20 Javascript
antd 表格列宽自适应方法以及错误处理操作
2020/10/27 Javascript
举例讲解Python中is和id的用法
2015/04/03 Python
python的dataframe和matrix的互换方法
2018/04/11 Python
Python流行ORM框架sqlalchemy安装与使用教程
2019/06/04 Python
Python matplotlib绘制饼状图功能示例
2019/09/10 Python
python是否适合网页编程详解
2019/10/04 Python
python使用梯度下降算法实现一个多线性回归
2020/03/24 Python
导致python中import错误的原因是什么
2020/07/01 Python
Python装饰器如何实现修复过程解析
2020/09/05 Python
python 实现百度网盘非会员上传超过500个文件的方法
2021/01/07 Python
Nebula美国官网:便携式投影仪
2019/03/15 全球购物
加拿大的标志性百货公司:Hudson’s Bay(哈得逊湾)
2019/09/03 全球购物
英国运动风奢侈品购物网站:Maison De Fashion
2020/08/28 全球购物
前台文员岗位职责及工作流程
2013/11/19 职场文书
成龙霸王洗发水广告词
2014/03/14 职场文书
服务行业口号
2014/06/11 职场文书
大学生职业生涯十年规划书范文
2014/09/17 职场文书
Python3接口性能测试实例代码
2021/06/20 Python
mysqldump进行数据备份详解
2022/07/15 MySQL