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 相关文章推荐
pycharm 使用心得(五)断点调试
Jun 06 Python
Python中type的构造函数参数含义说明
Jun 21 Python
Python中元组,列表,字典的区别
May 21 Python
Python贪心算法实例小结
Apr 22 Python
python数据结构学习之实现线性表的顺序
Sep 28 Python
Python从函数参数类型引出元组实例分析
May 28 Python
基于python2.7实现图形密码生成器的实例代码
Nov 05 Python
使用tensorflow实现矩阵分解方式
Feb 07 Python
python如何处理程序无法打开
Jun 16 Python
python如何调用java类
Jul 05 Python
python简单实现9宫格图片实例
Sep 03 Python
Python MNIST手写体识别详解与试练
Nov 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
PHP抓取、分析国内视频网站的视频信息工具类
2014/04/02 PHP
一个php生成16位随机数的代码(两种方法)
2014/09/16 PHP
PHP模板引擎Smarty中的保留变量用法分析
2016/04/11 PHP
详解php中的implements 使用
2017/06/13 PHP
Three.js源码阅读笔记(Object3D类)
2012/12/27 Javascript
Javacript实现颜色梯度变化和渐变的效果代码
2013/05/31 Javascript
JS加jquery简单实现标签元素的显示或隐藏
2013/09/23 Javascript
Javascript WebSocket使用实例介绍(简明入门教程)
2014/04/16 Javascript
jQuery插件zTree实现删除树子节点的方法示例
2017/03/08 Javascript
JS实现直接运行html代码的方法
2017/03/13 Javascript
借助node实战JSONP跨域实例
2017/03/30 Javascript
javascript 中null和undefined区分和比较
2017/04/19 Javascript
JavaScript创建对象_动力节点Java学院整理
2017/06/27 Javascript
Node接收电子邮件的实例代码
2017/07/21 Javascript
React如何将组件渲染到指定DOM节点详解
2017/09/08 Javascript
vue轮播图插件vue-concise-slider的使用
2018/03/13 Javascript
详解React项目的服务端渲染改造(koa2+webpack3.11)
2018/03/19 Javascript
如何使用proxy实现一个简单完整的MVVM库的示例代码
2019/09/17 Javascript
vue-devtools的安装和使用步骤详解
2019/10/17 Javascript
layui前端时间戳转化实例
2019/11/15 Javascript
JavaScript实现浏览器网页自动滚动并点击的示例代码
2020/12/05 Javascript
详解Python的迭代器、生成器以及相关的itertools包
2015/04/02 Python
基于python 爬虫爬到含空格的url的处理方法
2018/05/11 Python
Python实现自定义函数的5种常见形式分析
2018/06/16 Python
python 实现矩阵上下/左右翻转,转置的示例
2019/01/23 Python
PyCharm2019安装教程及其使用(图文教程)
2019/09/29 Python
CSS3的新特性介绍
2008/10/31 HTML / CSS
美国正宗奢华复古手袋、珠宝及配饰网站:What Goes Around Comes Around
2018/07/21 全球购物
什么是事务?为什么需要事务?
2012/01/09 面试题
行政专员岗位职责范本
2014/08/26 职场文书
社区重阳节活动总结
2015/03/24 职场文书
学校办公室主任岗位职责
2015/04/01 职场文书
2016学雷锋优秀志愿者事迹材料
2016/02/25 职场文书
优秀大学生申请书
2019/06/24 职场文书
死磕 java同步系列之synchronized解析
2021/06/28 Java/Android
JavaScript的Set数据结构详解
2022/02/18 Javascript