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中的文本处理
Apr 11 Python
Python使用PIL库实现验证码图片的方法
Mar 11 Python
Django 路由系统URLconf的使用
Oct 11 Python
Python完成毫秒级抢淘宝大单功能
Jun 06 Python
使用Python轻松完成垃圾分类(基于图像识别)
Jul 09 Python
Python自动化导出zabbix数据并发邮件脚本
Aug 16 Python
python中class的定义及使用教程
Sep 18 Python
使用pandas的box_plot去除异常值
Dec 10 Python
PyCharm汉化安装及永久激活详细教程(靠谱)
Jan 16 Python
pycharm 如何取消连按两下shift出现的全局搜索
Jan 15 Python
opencv读取视频并保存图像的方法
Jun 04 Python
详解解Django 多对多表关系的三种创建方式
Aug 23 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
php5.3 废弃函数小结
2010/05/16 PHP
php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
2013/09/28 PHP
用php守护另一个php进程的例子
2015/02/13 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
2020/04/04 PHP
javascript返回顶部效果(自写代码)
2013/01/06 Javascript
JavaScript var声明变量背后的原理示例解析
2013/10/12 Javascript
简单的ajax连接库分享(不用jquery的ajax)
2014/01/19 Javascript
javascript:void(0)的问题使用探讨
2014/04/10 Javascript
js如何判断用户是在PC端和还是移动端访问
2014/04/24 Javascript
js 加密压缩出现bug解决方案
2014/11/25 Javascript
Javascript中的作用域和上下文深入理解
2015/07/03 Javascript
深入理解ECMAScript的几个关键语句
2016/06/01 Javascript
jQuery读取本地的json文件(实例讲解)
2017/10/31 jQuery
详解自定义ajax支持跨域组件封装
2018/02/08 Javascript
vue导航栏部分的动态渲染实例
2019/11/01 Javascript
vue动态合并单元格并添加小计合计功能示例
2020/11/26 Vue.js
Python新手在作用域方面经常容易碰到的问题
2015/04/03 Python
python多进程共享变量
2016/04/06 Python
python爬虫实战之爬取京东商城实例教程
2017/04/24 Python
Python实现购物系统(示例讲解)
2017/09/13 Python
Python贪心算法实例小结
2018/04/22 Python
django的settings中设置中文支持的实现
2019/04/28 Python
Python3批量生成带logo的二维码方法
2019/06/24 Python
HTML5 Canvas的常用线条属性值总结
2016/03/17 HTML / CSS
html5唤醒APP小记
2019/03/27 HTML / CSS
临床医师专业个人自我评价范文
2013/11/07 职场文书
产品质量承诺书
2014/03/27 职场文书
高中教师考核方案
2014/05/18 职场文书
企业金融服务方案
2014/06/03 职场文书
基层党建工作宣传标语
2014/06/24 职场文书
2015大学生自我评价范文
2015/03/03 职场文书
2015年医务科工作总结范文
2015/05/26 职场文书
2016新教师培训心得体会范文
2016/01/08 职场文书
青少年法制教育心得体会
2016/01/14 职场文书
志愿服务心得体会
2016/01/15 职场文书
创业计划书之干洗店
2019/09/10 职场文书