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连接sql server乱码的解决方法
Jan 28 Python
python中getattr函数使用方法 getattr实现工厂模式
Jan 20 Python
给Python初学者的一些编程技巧
Apr 03 Python
让Python更加充分的使用Sqlite3
Dec 11 Python
python实现顺序表的简单代码
Sep 28 Python
Python中实例化class的执行顺序示例详解
Oct 14 Python
详解Python3 基本数据类型
Apr 19 Python
django做form表单的数据验证过程详解
Jul 26 Python
python conda操作方法
Sep 11 Python
python 利用已有Ner模型进行数据清洗合并代码
Dec 24 Python
Python调用Windows命令打印文件
Feb 07 Python
vue.js刷新当前页面的实例讲解
Dec 29 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
session 的生命周期是多长
2006/10/09 PHP
PHP+MYSQL开发工具及资源收藏
2007/01/02 PHP
php面向对象中static静态属性和静态方法的调用
2015/02/08 PHP
php header函数的常用http头设置
2015/06/25 PHP
PHP PDOStatement::nextRowset讲解
2019/02/01 PHP
在网页中屏蔽快捷键
2006/09/06 Javascript
jquery自动完成插件(autocomplete)应用之PHP版
2009/12/15 Javascript
js查错流程归纳
2012/05/04 Javascript
5种处理js跨域问题方法汇总
2014/12/04 Javascript
js实现Form栏显示全格式时间时钟效果代码
2015/08/19 Javascript
JQuery实现图片轮播效果
2015/09/15 Javascript
结合代码图文讲解JavaScript中的作用域与作用域链
2016/07/05 Javascript
AngularJS基础 ng-disabled 指令详解及简单示例
2016/08/01 Javascript
angular中的cookie读写方法
2017/08/02 Javascript
Vue-cli创建项目从单页面到多页面的方法
2017/09/20 Javascript
React Native 真机断点调试+跨域资源加载出错问题的解决方法
2018/01/18 Javascript
详解ES6 系列之异步处理实战
2018/10/26 Javascript
Vue 中如何正确引入第三方模块的方法步骤
2019/05/05 Javascript
微信小程序在线客服自动回复功能(基于node)
2019/07/03 Javascript
Vue源码分析之Vue实例初始化详解
2019/08/25 Javascript
Layui给switch添加响应事件的例子
2019/09/03 Javascript
详解JavaScript中精度失准问题及解决方法
2020/02/04 Javascript
Python使用Pycrypto库进行RSA加密的方法详解
2016/06/06 Python
详解Python中的from..import绝对导入语句
2016/06/21 Python
你真的了解Python的random模块吗?
2017/12/12 Python
Python测试网络连通性示例【基于ping】
2018/08/03 Python
Python3 实现减少可调用对象的参数个数
2019/12/20 Python
python如何使用Redis构建分布式锁
2020/01/16 Python
Python之qq自动发消息的示例代码
2021/02/18 Python
经济实惠的豪华背包和行李袋:Packs Project
2018/10/17 全球购物
视光学毕业生自荐书范文
2014/02/13 职场文书
《赶海》教学反思
2014/04/20 职场文书
幼师辞职信怎么写
2015/02/27 职场文书
岗位聘任报告
2015/03/02 职场文书
小学生读书笔记范文
2015/06/30 职场文书
同学会感言
2015/07/30 职场文书