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使用marshal模块序列化实例
Sep 25 Python
Python THREADING模块中的JOIN()方法深入理解
Feb 18 Python
Python socket编程实例详解
May 27 Python
python如何实现excel数据添加到mongodb
Jul 30 Python
python快排算法详解
Mar 04 Python
python解析xml简单示例
Jun 21 Python
python selenium 查找隐藏元素 自动播放视频功能
Jul 24 Python
Python利用WMI实现ping命令的例子
Aug 14 Python
Python基于gevent实现文件字符串查找器
Aug 11 Python
详解Django中的FBV和CBV对比分析
Mar 01 Python
健身房被搭讪?用python写了个小米计时器助人为乐
Jun 08 Python
asyncio异步编程之Task对象详解
Mar 13 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打造智能化的柱状图程序,用于报表等
2015/06/19 PHP
PHP的swoole扩展安装方法详细教程
2016/05/18 PHP
php微信开发之批量生成带参数的二维码
2016/06/26 PHP
php图形jpgraph操作实例分析
2017/02/22 PHP
在Laravel的Model层做数据缓存的实现
2019/09/26 PHP
一段利用WSH修改和查看IP配置的代码
2008/05/11 Javascript
ExtJs 表单提交登陆实现代码
2010/08/19 Javascript
Javascript面象对象成员、共享成员变量实验
2010/11/19 Javascript
jquery快捷动态绑定键盘事件的操作函数代码
2013/10/17 Javascript
js完美的div拖拽实例代码
2014/01/22 Javascript
Javascript中3种实现继承的方法和代码实例
2014/08/12 Javascript
JS实现的网页背景闪电闪烁效果代码
2015/10/17 Javascript
Web前端新人笔记之jquery入门心得(新手必看)
2016/05/17 Javascript
灵活使用数组制作图片切换js实现
2016/07/28 Javascript
codeMirror插件使用讲解
2017/01/16 Javascript
AngularJS之ionic 框架下实现 Localstorage本地存储
2017/04/22 Javascript
jQuery判断网页是否已经滚动到浏览器底部的实现方法
2017/10/27 jQuery
vue debug 二种方法
2018/09/16 Javascript
微信小程序实现列表页的点赞和取消点赞功能
2018/11/02 Javascript
在vue项目中引入vue-beauty操作方法
2019/02/11 Javascript
node.js中fs文件系统模块的使用方法实例详解
2020/02/13 Javascript
vue+animation实现翻页动画
2020/06/29 Javascript
JS canvas实现画板和签字板功能
2021/02/23 Javascript
python对数组进行反转的方法
2015/05/20 Python
python正则表达式去除两个特殊字符间的内容方法
2018/12/24 Python
python 动态生成变量名以及动态获取变量的变量名方法
2019/01/20 Python
Python Matplotlib 基于networkx画关系网络图
2019/07/10 Python
使用遗传算法求二元函数的最小值
2020/02/11 Python
python 中不同包 类 方法 之间的调用详解
2020/03/09 Python
在python3.64中安装pyinstaller库的方法步骤
2020/06/02 Python
使用CSS3实现圆角,阴影,透明
2014/12/23 HTML / CSS
美国顶级品牌男士大码服装店:DXL
2017/08/30 全球购物
会计电算化应届生求职信
2013/11/03 职场文书
风险评估实施方案
2014/03/09 职场文书
2014年无财产无子女离婚协议书范本
2014/10/09 职场文书
大一新生检讨书
2014/10/29 职场文书