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中__init__和__new__的区别详解
Jul 09 Python
Python多线程编程(七):使用Condition实现复杂同步
Apr 05 Python
Python定时执行之Timer用法示例
May 27 Python
python利用微信公众号实现报警功能
Jun 10 Python
django中ORM模型常用的字段的使用方法
Mar 05 Python
pyqt5 tablewidget 利用线程动态刷新数据的方法
Jun 17 Python
python中字符串数组逆序排列方法总结
Jun 23 Python
详解python深浅拷贝区别
Jun 24 Python
python之列表推导式的用法
Nov 29 Python
python利用线程实现多任务
Sep 18 Python
python中实现栈的三种方法
Dec 19 Python
pytorch损失反向传播后梯度为none的问题
May 12 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
AM/FM收音机的安装与调试
2021/03/02 无线电
php实例分享之mysql数据备份
2014/05/19 PHP
thinkphp3.x连接mysql数据库的方法(具体操作步骤)
2016/05/19 PHP
PHP实现图的邻接矩阵表示及几种简单遍历算法分析
2017/11/24 PHP
PHP面向对象程序设计子类扩展父类(子类重新载入父类)操作详解
2019/06/14 PHP
Laravel框架实现多数据库连接操作详解
2019/07/12 PHP
jquery解析xml字符串简单示例
2014/04/11 Javascript
Dojo Javascript 编程规范 规范自己的JavaScript书写
2014/10/26 Javascript
详细分析JavaScript函数定义
2015/07/16 Javascript
使用JQuery FancyBox插件实现图片展示特效
2015/11/16 Javascript
jQuery如何使用自动触发事件trigger
2015/11/29 Javascript
JavaScript文档碎片操作实例分析
2015/12/12 Javascript
很全面的JavaScript常用功能汇总集合
2016/01/22 Javascript
详解JavaScript数组和字符串中去除重复值的方法
2016/03/07 Javascript
js鼠标单击和双击事件冲突问题的快速解决方法
2016/07/11 Javascript
jQuery插件FusionWidgets实现的AngularGauge图效果示例【附demo源码】
2017/03/23 jQuery
AngularJS中使用ngModal模态框实例
2017/05/27 Javascript
详解微信小程序用定时器实现倒计时效果
2019/04/30 Javascript
解决Vue大括号字符换行踩的坑
2020/11/09 Javascript
Python中使用dom模块生成XML文件示例
2015/04/05 Python
python实现将html表格转换成CSV文件的方法
2015/06/28 Python
Python的for和break循环结构中使用else语句的技巧
2016/05/24 Python
Python字典的核心底层原理讲解
2019/01/24 Python
Python新手学习raise用法
2020/06/03 Python
css3一款3D字体带阴影效果的实现步骤
2013/03/20 HTML / CSS
StubHub新加坡:购买和出售全球活动门票
2017/03/10 全球购物
Chupi官网:在爱尔兰手工制作的订婚、结婚戒指和精美珠宝
2020/09/28 全球购物
财务会计毕业生个人求职信
2014/02/03 职场文书
社区母亲节活动方案
2014/03/05 职场文书
农林环境专业求职信
2014/03/13 职场文书
蟋蟀的住宅教学反思
2014/04/26 职场文书
涉密人员保密承诺书
2014/05/28 职场文书
开展党的群众路线教育实践活动工作总结
2014/11/05 职场文书
Nginx服务器如何设置url链接
2021/03/31 Servers
Python使用scapy模块发包收包
2021/05/07 Python
mysql主从复制的实现步骤
2021/10/24 MySQL