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实现动态添加类的属性或成员函数的解决方法
Jul 16 Python
Python网络编程中urllib2模块的用法总结
Jul 12 Python
wxpython中Textctrl回车事件无效的解决方法
Jul 21 Python
Python使用微信SDK实现的微信支付功能示例
Jun 30 Python
matplotlib简介,安装和简单实例代码
Dec 26 Python
基于Python log 的正确打开方式
Apr 28 Python
Python使用到第三方库PyMuPDF图片与pdf相互转换
May 03 Python
Django框架中序列化和反序列化的例子
Aug 06 Python
python matplotlib.pyplot.plot()参数用法
Apr 14 Python
tensorflow 2.0模式下训练的模型转成 tf1.x 版本的pb模型实例
Jun 22 Python
Python2与Python3关于字符串编码处理的差别总结
Sep 07 Python
使用python操作lmdb对数据读取的实例
Dec 11 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
Re:从零开始的异世界生活 第2季 开播啦
2020/07/24 日漫
destoon常用的安全设置概述
2014/06/21 PHP
PHP实现的简易版图片相似度比较
2015/01/07 PHP
PHP+MySQL修改记录的方法
2015/01/21 PHP
tp5(thinkPHP5)框架连接数据库的方法示例
2018/12/24 PHP
网上应用的一个不错common.js脚本
2007/08/08 Javascript
jquery.fileEveryWhere.js 一个跨浏览器的file显示插件
2011/10/24 Javascript
javascript图片相似度算法实现 js实现直方图和向量算法
2014/01/14 Javascript
MVC+jQuery.Ajax异步实现增删改查和分页
2020/12/22 Javascript
关于JSON.parse(),JSON.stringify(),jQuery.parseJSON()的用法
2016/06/30 Javascript
详解Vue生命周期的示例
2017/03/10 Javascript
JavaScript引用类型Object常见用法实例分析
2018/08/08 Javascript
angularJs自定义过滤器实现手机号信息隐藏的方法
2018/10/08 Javascript
浅析Proxy可以优化vue的数据监听机制问题及实现思路
2018/11/29 Javascript
JS中的算法与数据结构之集合(Set)实例详解
2019/08/20 Javascript
Node配合WebSocket做多文件下载以及进度回传
2019/11/07 Javascript
Echarts实现多条折线可拖拽效果
2019/12/19 Javascript
javascript设计模式 ? 原型模式原理与应用实例分析
2020/04/10 Javascript
jQuery HTML设置内容和属性操作实例分析
2020/05/20 jQuery
在vue中created、mounted等方法使用小结
2020/07/21 Javascript
[01:01:43]EG vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
Python读写文件方法总结
2015/06/09 Python
简单解决Python文件中文编码问题
2015/11/22 Python
Django验证码的生成与使用示例
2017/05/20 Python
TensorFlow 合并/连接数组的方法
2018/07/27 Python
六行python代码的爱心曲线详解
2019/05/17 Python
Python使用Pandas库实现MySQL数据库的读写
2019/07/06 Python
Python如何省略括号方法详解
2020/03/21 Python
详解python中groupby函数通俗易懂
2020/05/14 Python
Python如何将模块打包并发布
2020/08/30 Python
HTML5 Canvas标签使用收录
2009/07/07 HTML / CSS
新加坡网上花店:FlowerAdvisor新加坡
2018/10/05 全球购物
JSF如何进行表格处理及取值
2012/08/06 面试题
节能环保演讲稿
2014/08/28 职场文书
地球上的星星观后感
2015/06/02 职场文书
不会写演讲稿,快来看看这篇文章!
2019/08/06 职场文书