Python实现Dijkstra算法


Posted in Python onOctober 17, 2018

Dijkstra算法

迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。

迪杰斯特拉算法是求从某一个起点到其余所有结点的最短路径,是一对多的映射关系,是一种贪婪算法

示例:

Python实现Dijkstra算法

算法

算法实现流程思路:
迪杰斯特拉算法每次只找离起点最近的一个结点,并将之并入已经访问过结点的集合(以防重复访问,陷入死循环),然后将刚找到的最短路径的结点作为中间结点来更新相邻结点的路径长度,这样循环找到图中一个个结点的最短路径。

"""
输入
graph 输入的图
src 原点
返回
dis 记录源点到其他点的最短距离
path 路径
"""
import json
def dijkstra(graph,src):
  if graph ==None:
    return None
  # 定点集合
  nodes = [i for i in range(len(graph))] # 获取顶点列表,用邻接矩阵存储图
  # 顶点是否被访问
  visited = []
  visited.append(src)
  # 初始化dis
  dis = {src:0}# 源点到自身的距离为0
  for i in nodes:
    dis[i] = graph[src][i]
  path={src:{src:[]}} # 记录源节点到每个节点的路径
  k=pre=src
  while nodes:
    temp_k = k
    mid_distance=float('inf') # 设置中间距离无穷大
    for v in visited:
      for d in nodes:
        if graph[src][v] != float('inf') and graph[v][d] != float('inf'):# 有边
          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
    if k!=src and temp_k==k:
      break
    dis[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(nodes)
  return dis,path
if __name__ == '__main__':
  # 输入的有向图,有边存储的就是边的权值,无边就是float('inf'),顶点到自身就是0
  graph = [ 
    [0, float('inf'), 10, float('inf'), 30, 100],
    [float('inf'), 0, 5, float('inf'), float('inf'), float('inf')],
    [float('inf'), float('inf'), 0, 50, float('inf'), float('inf')],
    [float('inf'), float('inf'), float('inf'), 0, float('inf'), 10],
    [float('inf'), float('inf'), float('inf'), 20, 0, 60],
    [float('inf'), float('inf'), float('inf'), float('inf'), float('inf'), 0]]
  dis,path= dijkstra(graph, 0) # 查找从源点0开始带其他节点的最短路径
  print(dis)
  print(json.dumps(path, indent=4))

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Python 相关文章推荐
Python自定义函数的创建、调用和函数的参数详解
Mar 11 Python
在Django同1个页面中的多表单处理详解
Jan 25 Python
Python3中条件控制、循环与函数的简易教程
Nov 21 Python
Python实现的堆排序算法原理与用法实例分析
Nov 22 Python
python随机数分布random测试
Aug 27 Python
Python mutiprocessing多线程池pool操作示例
Jan 30 Python
使用Python控制摄像头拍照并发邮件
Apr 23 Python
cProfile Python性能分析工具使用详解
Jul 22 Python
使用python绘制温度变化雷达图
Oct 18 Python
python实现俄罗斯方块游戏(改进版)
Mar 13 Python
python七种方法判断字符串是否包含子串
Aug 18 Python
Python用dilb提取照片上人脸的示例
Oct 26 Python
使用Python抓取豆瓣影评数据的方法
Oct 17 #Python
python 对key为时间的dict排序方法
Oct 17 #Python
解决python中os.listdir()函数读取文件夹下文件的乱序和排序问题
Oct 17 #Python
通过python将大量文件按修改时间分类的方法
Oct 17 #Python
python检测文件夹变化,并拷贝有更新的文件到对应目录的方法
Oct 17 #Python
python按时间排序目录下的文件实现方法
Oct 17 #Python
python3 读取Excel表格中的数据
Oct 16 #Python
You might like
无需重新编译php加入ftp扩展的解决方法
2013/02/07 PHP
php模板原理讲解
2013/11/13 PHP
使用php方法curl抓取AJAX异步内容思路分析及代码分享
2014/08/25 PHP
推荐十款免费 WordPress 插件
2015/03/24 PHP
浅谈php://filter的妙用
2019/03/05 PHP
微信推送功能实现方式图文详解
2019/07/12 PHP
Gambit vs CL BO3 第三场 2.13
2021/03/10 DOTA
js的闭包的一个示例说明
2008/11/18 Javascript
Javascript学习笔记6 prototype的提出
2010/01/11 Javascript
40个有创意的jQuery图片和内容滑动及弹出插件收藏集之三
2012/01/03 Javascript
使用jQuery内容过滤选择器选择元素实例讲解
2013/04/18 Javascript
利用javascript打开模态对话框(示例代码)
2014/01/11 Javascript
购物车选中得到价格实现示例
2014/01/26 Javascript
javascript实现日期格式转换
2014/12/16 Javascript
js实现checkbox全选、不选与反选的方法
2015/02/09 Javascript
用js将long型数据转换成date型或datetime型的实例
2017/07/03 Javascript
vue监听scroll的坑的解决方法
2017/09/07 Javascript
javascript删除数组元素的七个方法示例
2019/09/09 Javascript
部署vue+Springboot前后端分离项目的步骤实现
2020/05/31 Javascript
Python编程flask使用页面模版的方法
2018/12/28 Python
Python英文文本分词(无空格)模块wordninja的使用实例
2019/02/20 Python
python将类似json的数据存储到MySQL中的实例
2019/07/12 Python
Python数据可视化:幂律分布实例详解
2019/12/07 Python
python-视频分帧&amp;多帧合成视频实例
2019/12/10 Python
Python模块的制作方法实例分析
2019/12/21 Python
记录一下scrapy中settings的一些配置小结
2020/09/28 Python
flask项目集成swagger的方法
2020/12/09 Python
Waterford美国官网:爱尔兰水晶制品品牌
2017/04/26 全球购物
会计岗位描述
2014/02/22 职场文书
教师对学生的寄语
2014/04/03 职场文书
乡镇干部个人对照检查材料(群众路线)
2014/09/26 职场文书
学校中秋节活动总结
2015/03/23 职场文书
中秋节晚会开场白
2015/05/29 职场文书
六年级作文之关于梦
2019/10/22 职场文书
教你怎么用Python实现GIF动图的提取及合成
2021/06/15 Python
Python使用plt.boxplot()函数绘制箱图、常用方法以及含义详解
2022/08/14 Python