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实现一个简单的线程池
Apr 07 Python
Python基于列表模拟堆栈和队列功能示例
Jan 05 Python
python构建深度神经网络(DNN)
Mar 10 Python
使用Python向DataFrame中指定位置添加一列或多列的方法
Jan 29 Python
python 读取修改pcap包的例子
Jul 23 Python
pytorch索引查找 index_select的例子
Aug 18 Python
浅谈pytorch grad_fn以及权重梯度不更新的问题
Aug 20 Python
python创建学生管理系统
Nov 22 Python
pytorch模型存储的2种实现方法
Feb 14 Python
Python修改列表值问题解决方案
Mar 06 Python
pytorch 如何把图像数据集进行划分成train,test和val
May 31 Python
解决pycharm下载库时出现Failed to install package的问题
Sep 04 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
文章推荐系统(三)
2006/10/09 PHP
php项目打包方法
2008/02/18 PHP
PHP实现中文圆形印章特效
2015/06/19 PHP
CodeIgniter辅助之第三方类库third_party用法分析
2016/01/20 PHP
YII Framework框架教程之安全方案详解
2016/03/14 PHP
PHP多维数组元素操作类的方法
2016/11/14 PHP
jquery中常用的SET和GET
2009/01/13 Javascript
Mootools 1.2教程 Fx.Morph、Fx选项和Fx事件
2009/09/15 Javascript
Firefox/Chrome/Safari的中可直接使用$/$$函数进行调试
2012/02/13 Javascript
ECMAScript 创建自己的js类库
2012/11/22 Javascript
15款jQuery分布引导插件分享
2015/02/04 Javascript
JavaScript中的函数(二)
2015/12/23 Javascript
百度地图给map添加右键菜单(判断是否为marker)
2016/03/04 Javascript
JS函数arguments数组获得实际传参数个数的实现方法
2016/05/28 Javascript
JavaScript中apply方法的应用技巧小结
2016/09/29 Javascript
JavaScript数组迭代方法
2017/03/03 Javascript
jQuery插件echarts设置折线图中折线线条颜色和折线点颜色的方法
2017/03/03 Javascript
xmlplus组件设计系列之文本框(TextBox)(3)
2017/05/03 Javascript
详解Layer弹出层样式
2017/08/21 Javascript
5分钟教你用nodeJS手写一个mock数据服务器的方法
2019/09/10 NodeJs
javascript实现商品图片放大镜
2019/11/28 Javascript
VSCode 添加自定义注释的方法(附带红色警戒经典注释风格)
2020/08/27 Javascript
electron踩坑之remote of undefined的解决
2020/10/06 Javascript
Python转换HTML到Text纯文本的方法
2015/01/15 Python
使用beaker让Facebook的Bottle框架支持session功能
2015/04/23 Python
Python的requests网络编程包使用教程
2016/07/11 Python
Python模块结构与布局操作方法实例分析
2017/07/24 Python
python列表,字典,元组简单用法示例
2019/07/11 Python
使用django和vue进行数据交互的方法步骤
2019/11/11 Python
python如何使用jt400.jar包代码实例
2019/12/20 Python
Python打印特殊符号及对应编码解析
2020/05/07 Python
Java如何基于wsimport调用wcf接口
2020/06/17 Python
通过实例解析python创建进程常用方法
2020/06/19 Python
详解HTML5中download属性的应用
2015/08/06 HTML / CSS
企业管理部经理岗位职责
2013/12/24 职场文书
Windows server 2012 R2 安装IIS服务器
2022/04/29 Servers