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 相关文章推荐
30分钟搭建Python的Flask框架并在上面编写第一个应用
Mar 30 Python
Python操作Excel之xlsx文件
Mar 24 Python
python编程实现归并排序
Apr 14 Python
使用Python的package机制如何简化utils包设计详解
Dec 11 Python
tensorflow输出权重值和偏差的方法
Feb 10 Python
python sort、sort_index方法代码实例
Mar 28 Python
500行代码使用python写个微信小游戏飞机大战游戏
Oct 16 Python
python通过链接抓取网站详解
Nov 20 Python
30行Python代码实现高分辨率图像导航的方法
May 22 Python
Python使用configparser读取ini配置文件
May 25 Python
Python竟然能剪辑视频
May 25 Python
详解pytorch创建tensor函数
Mar 22 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 fsockopen中多线程问题的解决办法[翻译]
2011/11/09 PHP
php和mysql中uft-8中文编码乱码的几种解决办法
2012/04/19 PHP
PHP分页效率终结版(推荐)
2013/07/01 PHP
Laravel 5框架学习之表单验证
2015/04/08 PHP
php中实现用数组妩媚地生成要执行的sql语句
2015/07/10 PHP
PHP基于文件存储实现缓存的方法
2015/07/20 PHP
PHP基础之输出缓冲区基本概念、原理分析
2019/06/19 PHP
javascript 实用的文字链提示框效果
2010/06/30 Javascript
图片img的src不变让浏览器重新加载实现方法
2013/03/29 Javascript
如何在JavaScript中实现私有属性的写类方式(一)
2013/12/04 Javascript
js实现的点击div区域外隐藏div区域
2014/06/30 Javascript
JavaScript操作Oracle数据库示例
2015/03/06 Javascript
微信小程序 获取微信OpenId详解及实例代码
2016/10/31 Javascript
Node.js环境下Koa2添加travis ci持续集成工具的方法
2017/06/19 Javascript
JS+HTML+CSS实现轮播效果
2017/11/28 Javascript
详解Puppeteer前端自动化测试实践
2019/02/21 Javascript
javascript导出csv文件(excel)的方法示例
2019/08/25 Javascript
JavaScript 事件代理需要注意的地方
2020/09/08 Javascript
element-ui点击查看大图的方法示例
2020/12/14 Javascript
[26:21]浴火之凤-TI4世界冠军Newbee战队纪录片
2014/08/07 DOTA
[00:12]2018DOTA2亚洲邀请赛SOLO赛 MidOne是否中单第一人?
2018/04/05 DOTA
浅析Python基础-流程控制
2016/03/18 Python
Python中定时任务框架APScheduler的快速入门指南
2017/07/06 Python
python Pandas 读取txt表格的实例
2018/04/29 Python
python爬虫之urllib,伪装,超时设置,异常处理的方法
2018/12/19 Python
使用Fabric自动化部署Django项目的实现
2019/09/27 Python
Python数组拼接np.concatenate实现过程
2020/04/18 Python
美国领先的水果篮送货公司和新鲜水果供应商:The Fruit Company
2018/02/13 全球购物
创先争优标语
2014/06/27 职场文书
大学生简短的自我评价
2014/09/12 职场文书
员工试用期自我鉴定范文
2014/09/15 职场文书
普通党员个人整改措施
2014/10/27 职场文书
先进工作者事迹材料
2014/12/23 职场文书
2015年学校总务工作总结
2015/07/20 职场文书
详解nodejs内置模块
2021/05/06 NodeJs
解决SpringBoot跨域的三种方式
2021/06/26 Java/Android