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实现360的字符显示界面
Feb 21 Python
详解Python中time()方法的使用的教程
May 22 Python
python sys,os,time模块的使用(包括时间格式的各种转换)
Apr 27 Python
从DataFrame中提取出Series或DataFrame对象的方法
Nov 10 Python
对pandas中时间窗函数rolling的使用详解
Nov 28 Python
python3.7 openpyxl 删除指定一列或者一行的代码
Oct 08 Python
Pycharm 安装 idea VIM插件的图文教程详解
Feb 21 Python
Python响应对象text属性乱码解决方案
Mar 31 Python
使用pth文件添加Python环境变量方式
May 26 Python
keras分类模型中的输入数据与标签的维度实例
Jul 03 Python
Python改变对象的字符串显示的方法
Aug 01 Python
如何将Pycharm中调整字体大小的方式设置为&quot;ctrl+鼠标滚轮上下滑&quot;
Nov 17 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下把数组保存为文件格式的实例应用
2010/02/08 PHP
PHP乱码问题,UTF-8乱码常见问题小结
2012/04/09 PHP
thinkphp实现面包屑导航(当前位置)例子分享
2014/05/10 PHP
PHP连接MSSQL时nvarchar字段长度被截断为255的解决方法
2014/12/25 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
2020/04/02 PHP
javascript 支持链式调用的异步调用框架Async.Operation
2009/08/04 Javascript
兼容多浏览器的iframe自适应高度(ie8 、谷歌浏览器4.0和 firefox3.5.3)
2009/11/04 Javascript
JavaScript学习笔记(十七)js 优化
2010/02/04 Javascript
使用Mootools动态添加Css样式表代码,兼容各浏览器
2011/12/12 Javascript
为JavaScript类型增加方法的实现代码(增加功能)
2011/12/29 Javascript
js清除input中type等于file的值域(示例代码)
2013/12/24 Javascript
IE中getElementsByName()对有些元素无效的解决方案
2014/09/28 Javascript
JS实现浏览器状态栏文字从右向左弹出效果代码
2015/10/27 Javascript
jQuery fancybox在ie浏览器下无法显示关闭按钮的解决办法
2016/02/19 Javascript
Bootstrap基本样式学习笔记之图片(6)
2016/12/07 Javascript
深入理解ES6学习笔记之块级作用域绑定
2017/08/19 Javascript
node中koa中间件机制详解
2017/08/22 Javascript
vue动态改变背景图片demo分享
2018/09/13 Javascript
浅谈在vue中使用mint-ui swipe遇到的问题
2018/09/27 Javascript
JavaScript实现shuffle数组洗牌操作示例
2019/01/03 Javascript
浅谈javascript错误处理
2019/08/11 Javascript
[08:40]Navi Vs Newbee
2018/06/07 DOTA
python 实现提取某个索引中某个时间段的数据方法
2019/02/01 Python
Python基于opencv实现的简单画板功能示例
2019/03/04 Python
Django 通过JS实现ajax过程详解
2019/07/30 Python
Python实现密钥密码(加解密)实例详解
2020/04/26 Python
Django:使用filter的pk进行多值查询操作
2020/07/15 Python
Python用摘要算法生成token及检验token的示例代码
2020/12/01 Python
新驾驶员个人自我评价
2014/01/03 职场文书
《郑和远航》教学反思
2014/04/16 职场文书
祖国在我心中演讲稿450字
2014/09/05 职场文书
关于运动会的广播稿(10篇)
2014/09/12 职场文书
烈士陵园观后感
2015/06/08 职场文书
校园新闻稿范文
2015/07/18 职场文书
Python道路车道线检测的实现
2021/06/27 Python
node.js使用express-fileupload中间件实现文件上传
2021/07/16 Javascript