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中as用法实例分析
Apr 30 Python
python 转换 Javascript %u 字符串为python unicode的代码
Sep 06 Python
python 简单的绘图工具turtle使用详解
Jun 21 Python
Python 装饰器使用详解
Jul 29 Python
python用户管理系统的实例讲解
Dec 23 Python
python设置值及NaN值处理方法
Jul 03 Python
python如何读取bin文件并下发串口
Jul 05 Python
Python内存管理实例分析
Jul 10 Python
Pycharm远程调试原理及具体配置详解
Aug 08 Python
Django接收自定义http header过程详解
Aug 23 Python
Python坐标线性插值应用实现
Nov 13 Python
给numpy.array增加维度的超简单方法
Jun 02 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获得用户使用的代理服务器ip即真实ip
2006/12/31 PHP
从手册去理解分析PHP session机制
2011/07/17 PHP
PHP内核介绍及扩展开发指南―基础知识
2011/09/11 PHP
WordPress主题中添加文章列表页页码导航的PHP代码实例
2015/12/22 PHP
javascript一些不错的函数脚本代码
2008/09/10 Javascript
利用JQuery和JS实现奇偶行背景颜色自定义效果
2012/11/19 Javascript
JS打印gridview实现原理及代码
2013/02/05 Javascript
javascript 操作符(~、&amp;、|、^、)使用案例
2014/12/31 Javascript
jquery实现标签支持图文排列带上下箭头按钮的选项卡
2015/03/14 Javascript
JavaScript 不支持 indexof 该如何解决
2016/03/30 Javascript
JavaScript常用判断写法大全(推荐)
2016/05/30 Javascript
学习JavaScript图片预加载模块
2016/11/07 Javascript
AngularJS中$http的交互问题
2017/03/29 Javascript
npm 更改默认全局路径以及国内镜像的方法
2018/05/16 Javascript
jQuery实现基本淡入淡出效果的方法详解
2018/09/05 jQuery
JS/HTML5游戏常用算法之碰撞检测 像素检测算法实例详解
2018/12/12 Javascript
vue使用localStorage保存登录信息 适用于移动端、PC端
2019/05/27 Javascript
关于微信小程序map组件z-index的层级问题分析
2019/07/09 Javascript
Vue 实现把表单form数据 转化成json格式的数据
2019/10/29 Javascript
javascript 原型与原型链的理解及应用实例分析
2020/02/10 Javascript
Python编程实现两个文件夹里文件的对比功能示例【包含内容的对比】
2017/06/20 Python
Python时间戳使用和相互转换详解
2017/12/11 Python
python实现多线程行情抓取工具的方法
2018/02/28 Python
python模拟实现斗地主发牌
2020/01/07 Python
python 控制台单行刷新,多行刷新实例
2020/02/19 Python
Python经典五人分鱼实例讲解
2021/01/04 Python
关于HTML5的22个初级技巧(图文教程)
2012/06/21 HTML / CSS
Monnier Freres中文官网:法国领先的奢侈品配饰在线零售商
2017/11/01 全球购物
工作自我评价怎么写
2014/01/29 职场文书
农贸市场管理制度
2014/01/31 职场文书
公证委托书模板
2014/04/03 职场文书
村主任“四风”问题个人整改措施
2014/10/04 职场文书
死亡诗社观后感
2015/06/05 职场文书
使用Redis实现点赞取消点赞的详细代码
2022/03/20 Redis
「月刊Comic Alive」2022年5月号封面公开
2022/03/21 日漫
SQL使用复合索引实现数据库查询的优化
2022/05/25 SQL Server