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 相关文章推荐
使用rpclib进行Python网络编程时的注释问题
May 06 Python
python控制台中实现进度条功能
Nov 10 Python
对numpy 数组和矩阵的乘法的进一步理解
Apr 04 Python
python和shell获取文本内容的方法
Jun 05 Python
解决python中无法自动补全代码的问题
Dec 04 Python
pandas读取csv文件,分隔符参数sep的实例
Dec 12 Python
解决python中画图时x,y轴名称出现中文乱码的问题
Jan 29 Python
python如何使用Redis构建分布式锁
Jan 16 Python
解决python-docx打包之后找不到default.docx的问题
Feb 13 Python
Python类和实例的属性机制原理详解
Mar 21 Python
Python基础教程(一)——Windows搭建开发Python开发环境
Jul 20 Python
完美处理python与anaconda环境变量的冲突问题
Apr 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
超人钢铁侠联手合作?美漫作家呼吁DC漫威合作联动以抵抗疫情
2020/04/09 欧美动漫
php读取msn上的用户信息类
2008/12/05 PHP
php array_map()数组函数使用说明
2011/07/12 PHP
如何在Ubuntu下启动Apache的Rewrite功能
2013/07/05 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十)
2014/06/24 PHP
php简单smarty入门程序实例
2015/06/11 PHP
PHP Cookei记录用户历史浏览信息的代码
2016/02/03 PHP
php安全配置记录和常见错误梳理(总结)
2017/03/28 PHP
javascript各种复制代码收集
2008/09/20 Javascript
基于jquery的商品展示放大镜
2010/08/07 Javascript
javascript jscroll模拟html元素滚动条
2012/12/18 Javascript
使图片旋转的3种解决方案
2013/11/21 Javascript
浅析Bootstrap组件之面板组件
2016/05/04 Javascript
基于MVC+EasyUI的web开发框架之使用云打印控件C-Lodop打印页面或套打报关运单信息
2016/08/29 Javascript
原生js实现对Ajax的封装(仿jquery)
2017/01/22 Javascript
Angular中使用better-scroll插件的方法
2018/03/27 Javascript
使用D3.js+Vue实现一个简单的柱形图
2018/08/05 Javascript
详解ESLint在Vue中的使用小结
2018/10/15 Javascript
vue2.0实现的tab标签切换效果(内容可自定义)示例
2019/02/11 Javascript
vue中npm包全局安装和局部安装过程
2019/09/03 Javascript
layui框架与SSM前后台交互的方法
2019/09/12 Javascript
移动端JS实现拖拽两种方法解析
2020/10/12 Javascript
[01:57]2018年度DOTA2最具潜力解说-完美盛典
2018/12/16 DOTA
python使用threading获取线程函数返回值的实现方法
2017/11/15 Python
在python中利用KNN实现对iris进行分类的方法
2018/12/11 Python
python实现控制COM口的示例
2019/07/03 Python
详细介绍Python进度条tqdm的使用
2019/07/31 Python
对Python获取屏幕截图的4种方法详解
2019/08/27 Python
python实现对列表中的元素进行倒序打印
2019/11/23 Python
python list数据等间隔抽取并新建list存储的例子
2019/11/27 Python
利用jupyter网页版本进行python函数查询方式
2020/04/14 Python
Python实现画图软件功能方法详解
2020/07/28 Python
在校生证明
2015/06/17 职场文书
幼儿园六一儿童节开幕词
2016/03/04 职场文书
python 爬取豆瓣网页的示例
2021/04/13 Python
python 闭包函数详细介绍
2022/04/19 Python