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中关于使用模块的基础知识
May 24 Python
Django中对数据查询结果进行排序的方法
Jul 17 Python
Python编码类型转换方法详解
Jul 01 Python
使用Python实现windows下的抓包与解析
Jan 15 Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
Feb 13 Python
对Python 多线程统计所有csv文件的行数方法详解
Feb 12 Python
将pip源更换到国内镜像的详细步骤
Apr 07 Python
在django模板中实现超链接配置
Aug 21 Python
python列表切片和嵌套列表取值操作详解
Feb 27 Python
Python如何获取文件指定行的内容
May 27 Python
python json.dumps() json.dump()的区别详解
Jul 14 Python
python工具dtreeviz决策树可视化和模型可解释性
Mar 03 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 visitFile()遍历指定文件夹函数
2010/08/21 PHP
对text数据类型不支持代码页转换 从: 1252 到: 936
2011/04/23 PHP
PHP_NETWORK_GETADDRESSES: GETADDRINFO FAILED问题解决办法
2014/05/04 PHP
基于PHP-FPM进程池探秘
2017/10/17 PHP
php插入mysql数据返回id的方法
2018/05/31 PHP
php 多继承的几种常见实现方法示例
2019/11/18 PHP
jQuery使用手册之 事件处理
2007/03/24 Javascript
关于IE、Firefox、Opera页面呈现异同 写脚本很痛苦
2009/08/28 Javascript
jquery ajax执行后台方法
2010/03/18 Javascript
js中判断文本框是否为空的两种方法
2011/07/31 Javascript
Prototype源码浅析 Enumerable部分(二)
2012/01/18 Javascript
缓动函数requestAnimationFrame 更好的实现浏览器经动画
2012/12/07 Javascript
jquery插件珍藏(图片局部放大/信息提示框)
2013/01/08 Javascript
JavaScript设计模式之装饰者模式介绍
2014/12/28 Javascript
javascript设计模式之中介者模式Mediator
2014/12/30 Javascript
js实现文本框支持加减运算的方法
2015/08/19 Javascript
iscroll.js的上拉下拉刷新时无法回弹的解决方法
2016/02/18 Javascript
ie下js不执行的几种可能
2017/02/28 Javascript
JS与HTML结合实现流程进度展示条思路详解
2017/09/03 Javascript
node实现socket链接与GPRS进行通信的方法
2019/05/20 Javascript
原生js+css调节音量滑块
2020/01/15 Javascript
Python闭包执行时值的传递方式实例分析
2018/06/04 Python
python 获取图片分辨率的方法
2019/01/08 Python
FFT快速傅里叶变换的python实现过程解析
2019/10/21 Python
python GUI库图形界面开发之PyQt5窗口类QMainWindow详细使用方法
2020/02/26 Python
Python configparser模块配置文件过程解析
2020/03/03 Python
解决flask接口返回的内容中文乱码的问题
2020/04/03 Python
解决使用python print打印函数返回值多一个None的问题
2020/04/09 Python
css3的transform中scale缩放详解
2014/12/08 HTML / CSS
澳大利亚香水在线:Price Rite Mart
2017/12/28 全球购物
Java中的类包括什么内容?设计时要注意哪些方面
2012/05/23 面试题
建筑专业自荐信
2013/10/18 职场文书
集团公司总经理岗位职责
2013/12/20 职场文书
自我鉴定四大框架
2014/01/17 职场文书
企业安全生产承诺书
2014/05/22 职场文书
个人工作总结(管理人员)范文
2019/08/13 职场文书