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下读取公私钥做加解密实例详解
Mar 29 Python
深入理解Python分布式爬虫原理
Nov 23 Python
python微信跳一跳游戏辅助代码解析
Jan 29 Python
Django rest framework实现分页的示例
May 24 Python
完美解决Python matplotlib绘图时汉字显示不正常的问题
Jan 29 Python
pyhanlp安装介绍和简单应用
Feb 22 Python
如何使用Python标准库进行性能测试
Jun 25 Python
Python模拟登录之滑块验证码的破解(实例代码)
Nov 18 Python
Window系统下Python如何安装OpenCV库
Mar 05 Python
Python基于pyecharts实现关联图绘制
Mar 27 Python
python爬虫学习笔记之Beautifulsoup模块用法详解
Apr 09 Python
Python 抓取数据存储到Redis中的操作
Jul 16 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/10/09 PHP
PHP中fwrite与file_put_contents性能测试代码
2013/08/02 PHP
PHP小技巧之函数重载
2014/06/02 PHP
PHP IDE phpstorm 常用快捷键
2015/05/18 PHP
jquery CSS选择器笔记
2010/03/29 Javascript
jQuery javaScript捕获回车事件(示例代码)
2013/11/07 Javascript
javascript阻止scroll事件多次执行的思路及实现
2013/11/08 Javascript
在线一元二次方程计算器实例(方程计算器在线计算)
2013/12/22 Javascript
jquery的ajax和getJson跨域获取json数据的实现方法
2014/02/04 Javascript
浅谈JavaScript的事件
2015/02/27 Javascript
jquery if条件语句的写法
2016/05/19 Javascript
详解JSON1:使用TSQL查询数据和更新JSON数据
2016/11/21 Javascript
bootstrap日历插件datetimepicker使用方法
2016/12/14 Javascript
AngularJs定时器$interval 和 $timeout详解
2017/05/25 Javascript
Angular利用trackBy提升性能的方法
2018/01/26 Javascript
关于微信小程序bug记录与解决方法
2018/08/15 Javascript
如何用Node写页面爬虫的工具集
2018/10/26 Javascript
利用js实现简易红绿灯
2020/10/15 Javascript
vue实现广告栏上下滚动效果
2020/11/26 Vue.js
Python EOL while scanning string literal问题解决方法
2020/09/18 Python
python 把文件中的每一行以数组的元素放入数组中的方法
2018/04/29 Python
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
2018/07/18 Python
用Python实现读写锁的示例代码
2018/11/05 Python
Python实现序列化及csv文件读取
2020/01/19 Python
佳能德国网上商店:Canon德国
2017/03/18 全球购物
汉森冲浪板:Hansen Surfboards
2018/05/19 全球购物
一份比较全的PHP面试题
2016/07/29 面试题
校长寄语大全
2014/04/09 职场文书
土地租赁意向书
2014/07/30 职场文书
银行奉献演讲稿
2014/09/16 职场文书
党支部四风整改方案
2014/10/25 职场文书
寒假安全保证书
2015/02/28 职场文书
小学班主任工作随笔
2015/08/15 职场文书
《小乌鸦爱妈妈》教学反思
2016/02/19 职场文书
Java基于Dijkstra算法实现校园导游程序
2022/03/17 Java/Android
html网页引入svg图片的4种方式
2022/08/05 HTML / CSS