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读写Excel文件的实例
Nov 01 Python
Python编写百度贴吧的简单爬虫
Apr 02 Python
基于python select.select模块通信的实例讲解
Sep 21 Python
Python实现的堆排序算法原理与用法实例分析
Nov 22 Python
python 中字典嵌套列表的方法
Jul 03 Python
python批量获取html内body内容的实例
Jan 02 Python
Python之lambda匿名函数及map和filter的用法
Mar 05 Python
Python字符串匹配之6种方法的使用详解
Apr 08 Python
PYTHON绘制雷达图代码实例
Oct 15 Python
keras模型可视化,层可视化及kernel可视化实例
Jan 24 Python
解决Python3.8用pip安装turtle-0.0.2出现错误问题
Feb 11 Python
基于python实现计算两组数据P值
Jul 10 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.MVC的模板标签系统(二)
2006/09/05 PHP
NO3第三帝国留言簿制作过程
2006/10/09 PHP
?算你??的 PHP 程式大小
2006/12/06 PHP
php校验表单检测字段是否为空的方法
2015/03/20 PHP
PHP常见错误提示含义解释(实用!值得收藏)
2016/04/25 PHP
php实现xml与json之间的相互转换功能实例
2016/07/07 PHP
php实现数组中出现次数超过一半的数字的统计方法
2018/10/14 PHP
php中如何执行linux命令详解
2018/11/06 PHP
Laravel 错误提示本地化的实现
2019/10/22 PHP
PHP const定义常量及global定义全局常量实例解析
2020/05/28 PHP
13个绚丽的Jquery 界面设计网站推荐
2010/09/28 Javascript
Javascript:为input设置readOnly属性(示例讲解)
2013/12/25 Javascript
jQuery 获取、设置HTML或TEXT内容的两种方法
2014/05/23 Javascript
JavaScript中实现继承的三种方式和实例
2015/01/29 Javascript
javascript中键盘事件用法实例分析
2015/01/30 Javascript
jQuery实现仿腾讯微博滑出效果报告每日天气的方法
2015/05/11 Javascript
jQuery Real Person验证码插件防止表单自动提交
2015/11/06 Javascript
Jquery表单验证失败后不提交的解决方法
2016/10/18 Javascript
Sequelize中用group by进行分组聚合查询
2016/12/12 Javascript
js实现图片上传并预览功能
2018/08/06 Javascript
vue中axios实现数据交互与跨域问题
2019/05/12 Javascript
微信小程序自定义支持图片的弹窗
2020/12/21 Javascript
python按照多个字符对字符串进行分割的方法
2015/03/17 Python
Python 基于Twisted框架的文件夹网络传输源码
2016/08/28 Python
Python数据可视化编程通过Matplotlib创建散点图代码示例
2017/12/09 Python
python输出pdf文档的实例
2020/02/13 Python
结合CSS3的新特性来总结垂直居中的实现方法
2016/05/30 HTML / CSS
详解利用canvas实现环形进度条的方法
2019/06/12 HTML / CSS
Piercing Pagoda官网:耳环、戒指、项链、手链等
2020/09/28 全球购物
企业节能减排实施方案
2014/03/19 职场文书
美食节策划方案
2014/05/26 职场文书
初中优秀教师事迹材料
2014/08/18 职场文书
民政局标准版离婚协议书
2014/12/01 职场文书
2015年派出所民警工作总结
2015/04/24 职场文书
工作迟到检讨书范文
2015/05/06 职场文书
后天观后感
2015/06/08 职场文书