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 返回汉字的汉语拼音
Feb 27 Python
Django框架中render_to_response()函数的使用方法
Jul 16 Python
python PIL模块与随机生成中文验证码
Feb 27 Python
Python实现简单的语音识别系统
Dec 13 Python
python多行字符串拼接使用小括号的方法
Mar 19 Python
python设定并获取socket超时时间的方法
Jan 12 Python
python绘制漏斗图步骤详解
Mar 04 Python
docker django无法访问redis容器的解决方法
Aug 21 Python
Python猴子补丁Monkey Patch用法实例解析
Mar 23 Python
使用K.function()调试keras操作
Jun 17 Python
CentOS 7如何实现定时执行python脚本
Jun 24 Python
Python基础之数据结构详解
Apr 28 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文本操作类
2006/11/25 PHP
Smarty模板引擎缓存机制详解
2016/05/23 PHP
编辑浪子版表单验证类
2007/05/12 Javascript
Three.js源码阅读笔记(Object3D类)
2012/12/27 Javascript
基于jQuery实现最基本的淡入淡出效果实例
2015/02/02 Javascript
jQuery实现类似淘宝网图片放大效果的方法
2015/07/08 Javascript
JavaScript阻止回车提交表单的方法
2015/12/30 Javascript
JavaScript的String字符串对象常用操作总结
2016/05/26 Javascript
javascript jquery对form元素的常见操作详解
2016/06/12 Javascript
springMVC结合AjaxForm上传文件
2016/07/12 Javascript
详解jQuery的表单验证插件--Validation
2016/12/21 Javascript
JavaWeb表单及时验证功能在输入后立即验证(含用户类型,性别,爱好...的验证)
2017/06/09 Javascript
js定时器+简单的动画效果实例
2017/11/10 Javascript
jQuery实现左右滑动的toggle方法
2018/03/03 jQuery
Vue 将后台传过来的带html字段的字符串转换为 HTML
2018/03/29 Javascript
JS实现图片转换成base64的各种应用场景实例分析
2018/06/22 Javascript
简述vue状态管理模式之vuex
2018/08/29 Javascript
从零使用TypeScript开发项目打包发布到npm
2020/02/14 Javascript
vue实现移动端触屏拖拽功能
2020/08/21 Javascript
vue 项目中当访问路由不存在的时候默认访问404页面操作
2020/08/31 Javascript
python文件名和文件路径操作实例
2017/09/29 Python
详解Django 中是否使用时区的区别
2018/06/14 Python
Python3.5局部变量与全局变量作用域实例分析
2019/04/30 Python
python实现在cmd窗口显示彩色文字
2019/06/24 Python
Django实现CAS+OAuth2的方法示例
2019/10/30 Python
Python爬取新型冠状病毒“谣言”新闻进行数据分析
2020/02/16 Python
Python集成开发工具Pycharm的安装和使用详解
2020/03/18 Python
解决python使用list()时总是报错的问题
2020/05/05 Python
pycharm配置QtDesigner的超详细方法
2021/01/25 Python
JVM是一个编译程序还是解释程序
2012/09/11 面试题
幼师自荐信范文
2013/10/06 职场文书
25岁生日感言
2014/01/13 职场文书
教师个人总结范文
2015/02/11 职场文书
2015廉洁自律个人总结
2015/02/14 职场文书
戒赌保证书
2015/05/11 职场文书
python通过新建环境安装tfx的问题
2022/05/20 Python