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通过opencv实现批量剪切图片
Nov 13 Python
python八大排序算法速度实例对比
Dec 06 Python
Python闭包执行时值的传递方式实例分析
Jun 04 Python
django框架自定义用户表操作示例
Aug 07 Python
Python重新加载模块的实现方法
Oct 16 Python
python面向对象法实现图书管理系统
Apr 19 Python
详解python编译器和解释器的区别
Jun 24 Python
使用python 将图片复制到系统剪贴中
Dec 13 Python
python 中的[:-1]和[::-1]的具体使用
Feb 13 Python
简单了解Django项目应用创建过程
Jul 06 Python
Python 生成短8位唯一id实战教程
Jan 13 Python
Python字典的基础操作
Nov 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
全国FM电台频率大全 - 25 云南省
2020/03/11 无线电
PHP易混淆函数的区别及用法汇总
2014/11/22 PHP
PHP使用pcntl_fork实现多进程下载图片的方法
2014/12/16 PHP
PHP中的使用curl发送请求(GET请求和POST请求)
2017/02/08 PHP
PHP实时统计中文字数和区别
2019/02/28 PHP
Laravel第三方包报class not found的解决方法
2019/10/13 PHP
如何使用jQuery来处理图片坏链具体实现步骤
2013/05/02 Javascript
jquery使用淘宝接口跨域查询手机号码归属地实例
2013/11/28 Javascript
jQuery对Select的操作大集合(收藏)
2013/12/28 Javascript
jQuery中remove()方法用法实例
2014/12/25 Javascript
JavaScript中数据结构与算法(一):栈
2015/06/19 Javascript
javascript表单验证大全
2015/08/12 Javascript
基于jquery实现左右按钮点击的图片切换效果
2021/01/27 Javascript
轻量级JS Cookie插件js-cookie的使用方法
2018/03/22 Javascript
浅谈node中的cluster集群
2018/06/02 Javascript
浅谈JavaScript闭包
2019/04/09 Javascript
Vue快速实现通用表单验证的示例代码
2020/01/09 Javascript
Windows系统配置python脚本开机启动的3种方法分享
2015/03/10 Python
python3.4用循环往mysql5.7中写数据并输出的实现方法
2017/06/20 Python
Python调用微信公众平台接口操作示例
2017/07/08 Python
Flask框架模板继承实现方法分析
2019/07/31 Python
关于Keras模型可视化教程及关键问题的解决
2020/01/24 Python
Python如何转换字符串大小写
2020/06/04 Python
matplotlib部件之套索Lasso的使用
2021/02/24 Python
美国最好的钓鱼、狩猎和划船装备商店:Bass Pro Shops
2018/12/02 全球购物
Farfetch巴西官网:奢侈品牌时尚购物平台
2020/10/19 全球购物
幼教求职信
2014/03/12 职场文书
2014年三万活动总结
2014/04/26 职场文书
促销活动总结模板
2014/07/01 职场文书
高中生旷课检讨书
2014/10/08 职场文书
新党章的学习心得体会
2014/11/07 职场文书
西岭雪山导游词
2015/02/06 职场文书
2015年重阳节活动总结
2015/03/24 职场文书
2016庆祝教师节新闻稿
2015/11/25 职场文书
2019年年中工作总结讲话稿模板
2019/03/25 职场文书
pytorch 实现变分自动编码器的操作
2021/05/24 Python