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正则表达式判断字符串是否是全部小写示例
Dec 25 Python
python中的多线程实例教程
Aug 27 Python
Python2.x中文乱码问题解决方法
Jun 02 Python
Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法
Apr 23 Python
Python set常用操作函数集锦
Nov 15 Python
python 图片二值化处理(处理后为纯黑白的图片)
Nov 01 Python
tensorflow指定GPU与动态分配GPU memory设置
Feb 03 Python
在Python IDLE 下调用anaconda中的库教程
Mar 09 Python
使用python从三个角度解决josephus问题的方法
Mar 27 Python
在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程
Apr 22 Python
python爬虫调度器用法及实例代码
Nov 30 Python
Python 转移文件至云对象存储的方法
Feb 07 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
天使彦史上最神还原,性别曝光的那一刻,百万网友恋爱了
2020/03/02 国漫
模拟xcopy的函数
2006/10/09 PHP
php通过修改header强制图片下载的方法
2015/03/24 PHP
基于mootools 1.3框架下的图片滑动效果代码
2011/04/22 Javascript
分享一个asp.net pager分页控件
2012/01/04 Javascript
js中的屏蔽的使用示例
2013/07/30 Javascript
jquery mobile开发常见问题分析
2016/01/21 Javascript
jquery 将当前时间转换成yyyymmdd格式的实现方法
2016/06/01 Javascript
完美实现八种js焦点轮播图(上篇)
2016/07/18 Javascript
Angular-Touch库用法示例
2016/12/22 Javascript
JavaScript自动点击链接 防止绕过浏览器访问的方法
2017/01/19 Javascript
Vue+axios 实现http拦截及路由拦截实例
2017/04/25 Javascript
Angularjs在360兼容模式下取数据缓存问题的解决办法
2017/06/22 Javascript
javaScript中封装的各种写法示例(推荐)
2017/07/03 Javascript
使用validate.js实现表单数据提交前的验证方法
2018/09/04 Javascript
Angular实现svg和png图片下载实现
2019/05/05 Javascript
Node.js API详解之 querystring用法实例分析
2020/04/29 Javascript
Vue 中使用lodash对事件进行防抖和节流操作
2020/07/26 Javascript
详解vue父子组件状态同步的最佳方式
2020/09/10 Javascript
[01:14:19]NAVI vs Mineski 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
Python数据结构之翻转链表
2017/02/25 Python
Django视图和URL配置详解
2018/01/31 Python
Python XlsxWriter模块Chart类用法实例分析
2019/03/11 Python
简单了解Python读取大文件代码实例
2019/12/18 Python
理解Django 中Call Stack机制的小Demo
2020/09/01 Python
python中spy++的使用超详细教程
2021/01/29 Python
英国最大的汽车配件在线商店:Euro Car Parts
2019/09/30 全球购物
广州地球村科技数据库题目
2016/04/25 面试题
介绍一下Ruby中的对象,属性和方法
2012/07/11 面试题
经典的班主任推荐信
2013/10/28 职场文书
工作表扬信范文
2015/01/17 职场文书
2015年中秋节演讲稿
2015/03/20 职场文书
留学推荐信(中英文版)
2015/03/26 职场文书
经典格言警句:没有热忱,世间便无进步
2019/11/13 职场文书
对PyTorch中inplace字段的全面理解
2021/05/22 Python
SpringCloud Function SpEL注入漏洞分析及环境搭建
2022/04/08 Java/Android