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(一)Python环境安装
Aug 20 Python
Python入门篇之面向对象
Oct 20 Python
python 显示数组全部元素的方法
Apr 19 Python
利用Anaconda简单安装scrapy框架的方法
Jun 13 Python
Flask web开发处理POST请求实现(登录案例)
Jul 26 Python
Python微信操控itchat的方法
May 31 Python
决策树剪枝算法的python实现方法详解
Sep 18 Python
Pytorch中的variable, tensor与numpy相互转化的方法
Oct 10 Python
python如何将两张图片生成为全景图片
Mar 05 Python
Python爬取12306车次信息代码详解
Aug 12 Python
装上这 14 个插件后,PyCharm 真的是无敌的存在
Jan 11 Python
Pytest之测试命名规则的使用
Apr 16 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的mkdir()函数创建文件夹比较安全的权限设置方法
2014/07/28 PHP
php实现删除指定目录下相关文件的方法
2014/10/20 PHP
用js+xml自动生成表格的东西
2006/12/21 Javascript
Javascript 去除数组的重复元素
2010/05/04 Javascript
简短几句 通俗解释javascript的闭包
2011/01/17 Javascript
如何获取JQUERY AJAX返回的JSON结果集实现代码
2012/12/10 Javascript
jQuery方法简洁实现隔行换色及toggleClass的使用
2013/03/15 Javascript
jquery删除ID为sNews的tr元素的内容
2014/04/10 Javascript
jquery实时获取时间的简单实例
2017/01/26 Javascript
JavaScript轻松创建级联函数的方法示例
2017/02/10 Javascript
JavaScript基本类型值-Undefined、Null、Boolean
2017/02/23 Javascript
jQuery插件ContextMenu自定义图标
2017/03/15 Javascript
jQuery实现动态删除LI的方法
2017/05/30 jQuery
详解Vue路由开启keep-alive时的注意点
2017/06/20 Javascript
vue.js源代码core scedule.js学习笔记
2017/07/03 Javascript
jQuery制作input提示内容(兼容IE8以上)
2017/07/05 jQuery
Angular弹出模态框的两种方式
2017/10/19 Javascript
微信小程序实现鼠标拖动效果示例
2017/12/01 Javascript
详解angular应用容器化部署
2018/08/14 Javascript
微信小程序实现侧边分类栏
2019/10/21 Javascript
[41:54]2018DOTA2亚洲邀请赛 4.1 小组赛A组加赛 TNC vs Liquid
2018/04/03 DOTA
[01:10:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第一场 3月4日
2021/03/11 DOTA
判断python对象是否可调用的三种方式及其区别详解
2019/01/31 Python
python银行系统实现源码
2019/10/25 Python
pycharm 对代码做静态检查操作
2020/06/09 Python
使用Python将xmind脑图转成excel用例的实现代码(一)
2020/10/12 Python
Python做图像处理及视频音频文件分离和合成功能
2020/11/24 Python
美国珠宝网上商店:Jeulia
2016/09/01 全球购物
Expedia印度尼西亚站:预订酒店、廉价航班和度假套餐
2018/01/31 全球购物
临床医师专业个人自我评价范文
2013/11/07 职场文书
十八大报告观后感
2014/01/28 职场文书
消防安全承诺书
2014/05/22 职场文书
2015国庆节66周年标语
2015/07/30 职场文书
幼儿园小朋友毕业感言
2015/07/30 职场文书
班组长如何制订适合本班组的工作计划?
2019/07/10 职场文书
Jmerte 分布式压测及分布式压测配置
2022/04/30 Java/Android