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中pycurl库的用法实例
Sep 30 Python
使用Python的Django框架实现事务交易管理的教程
Apr 20 Python
用python统计代码行的示例(包括空行和注释)
Jul 24 Python
python opencv旋转图像(保持图像不被裁减)
Jul 26 Python
python交换两个变量的值方法
Jan 12 Python
PyQt5实现从主窗口打开子窗口的方法
Jun 19 Python
Python猜数字算法题详解
Mar 01 Python
Python2.7:使用Pyhook模块监听鼠标键盘事件-获取坐标实例
Mar 14 Python
Python自动重新加载模块详解(autoreload module)
Apr 01 Python
Python新手学习raise用法
Jun 03 Python
Python替换NumPy数组中大于某个值的所有元素实例
Jun 08 Python
python中pop()函数的语法与实例
Dec 01 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
一个简单的自动发送邮件系统(一)
2006/10/09 PHP
浅谈apache和nginx的rewrite的区别
2013/02/22 PHP
关于使用coreseek并为其做分页的介绍
2013/06/21 PHP
ThinkPHP3.1新特性之查询条件预处理简介
2014/06/19 PHP
PHP 实现链式操作
2021/03/09 PHP
JavaScript 异步调用框架 (Part 2 - 用例设计)
2009/08/03 Javascript
JavaScript日历实现代码
2010/09/12 Javascript
用JSON做数据传输格式中的一些问题总结
2011/12/21 Javascript
js父窗口关闭时子窗口随之关闭完美解决方案
2014/04/29 Javascript
Javascript中3个需要注意的运算符
2015/04/02 Javascript
最新最热最实用的15个jQuery插件汇总
2015/07/05 Javascript
基于js实现的限制文本框只可以输入数字
2016/12/05 Javascript
原生js实现瀑布流布局
2017/03/08 Javascript
vue脚手架搭建项目的兼容性配置详解
2018/07/17 Javascript
JavaScript中的 new 命令
2019/05/22 Javascript
vue拖拽组件 vuedraggable API options实现盒子之间相互拖拽排序
2019/07/08 Javascript
基于vue和websocket的多人在线聊天室
2020/02/01 Javascript
详解用js代码触发dom事件的实现方案
2020/06/10 Javascript
[01:04:39]OG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python while、for、生成器、列表推导等语句的执行效率测试
2015/06/03 Python
如何使用python爬取csdn博客访问量
2016/02/14 Python
一个基于flask的web应用诞生 flask和mysql相连(4)
2017/04/11 Python
python判断设备是否联网的方法
2018/06/29 Python
python远程连接MySQL数据库
2019/04/19 Python
python爬虫 Pyppeteer使用方法解析
2019/09/28 Python
Python GUI库Tkiner使用方法代码示例
2020/11/27 Python
网页切图的CSS和布局经验与要点
2015/04/09 HTML / CSS
请编写一个 C 函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引值
2014/09/15 面试题
计算机专业个人简短的自我评价
2013/10/23 职场文书
2014年会演讲稿范文
2014/01/06 职场文书
高二历史教学反思
2014/01/25 职场文书
采购部经理岗位职责
2014/02/10 职场文书
财务管理职业生涯规划书
2014/02/26 职场文书
财政局党的群众路线教育实践活动整改方案
2014/09/21 职场文书
2016拓展训练心得体会范文
2016/01/12 职场文书
python使用pygame创建精灵Sprite
2021/04/06 Python