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 相关文章推荐
ssh批量登录并执行命令的python实现代码
May 25 Python
解决python3 urllib中urlopen报错的问题
Mar 25 Python
Python 列表(List) 的三种遍历方法实例 详解
Apr 15 Python
浅谈使用Python变量时要避免的3个错误
Oct 30 Python
Python for循环中的陷阱详解
Jul 13 Python
Django实现web端tailf日志文件功能及实例详解
Jul 28 Python
pytorch 在网络中添加可训练参数,修改预训练权重文件的方法
Aug 17 Python
PyTorch-GPU加速实例
Jun 23 Python
Pycharm打开已有项目配置python环境的方法
Jul 03 Python
基于python实现坦克大战游戏
Oct 27 Python
Python基本的内置数据类型及使用方法
Apr 13 Python
代码复现python目标检测yolo3详解预测
May 06 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
用header 发送cookie的php代码
2007/03/16 PHP
有关php运算符的知识大全
2011/11/03 PHP
PHP 第二节 数据类型之数组
2012/04/28 PHP
php for 循环使用的简单实例
2016/06/02 PHP
jQuery each()方法的使用方法
2010/03/18 Javascript
jquery 图片轮换效果
2010/07/29 Javascript
关于UTF-8的客户端用AJAX方式获取GB2312的服务器端乱码问题的解决办法
2010/11/30 Javascript
关于jQuery参考实例 1.0 jQuery的哲学
2013/04/07 Javascript
js实现百度联盟中一款不错的图片切换效果完整实例
2015/03/04 Javascript
对js中回调函数的一些看法
2016/08/29 Javascript
jquery中用jsonp实现搜索框功能
2016/10/18 Javascript
html中鼠标滚轮事件onmousewheel的处理方法
2016/11/11 Javascript
javascript实现用户点击数量统计
2016/12/25 Javascript
$.browser.msie 为空或不是对象问题的多种解决方法
2017/03/19 Javascript
vue上传图片组件编写代码
2017/07/26 Javascript
脚手架vue-cli工程webpack的基本用法详解
2018/09/29 Javascript
Vue源码中要const _toStr = Object.prototype.toString的原因分析
2018/12/09 Javascript
vue动态循环出的多个select出现过的变为disabled(实例代码)
2019/11/10 Javascript
基于openlayers实现角度测量功能
2020/09/28 Javascript
Numpy截取指定范围内的数据方法
2018/11/14 Python
Python 输入一个数字判断成绩分数等级的方法
2018/11/15 Python
django 类视图的使用方法详解
2019/07/24 Python
python将时分秒转换成秒的实例
2019/12/07 Python
Python有参函数使用代码实例
2020/01/06 Python
Python爬取YY评级分数并保存数据实现过程解析
2020/06/01 Python
Python环境配置实现pip加速过程解析
2020/11/27 Python
socket.io 和canvas 实现的共享画板功能
2019/05/22 HTML / CSS
阿联酋航空假期:Emirates Holidays
2018/03/20 全球购物
女士和男士时尚鞋在线购物:Shoespie
2019/02/28 全球购物
Visual-Click葡萄牙:欧洲领先的在线眼镜商
2020/02/17 全球购物
Simons官方网站:加拿大时尚零售商
2020/02/20 全球购物
Nayomi官网:沙特阿拉伯王国睡衣和内衣品牌
2020/12/19 全球购物
大三毕业自我鉴定
2014/01/15 职场文书
请假条怎么写
2014/04/10 职场文书
幼儿园师德师风学习材料
2014/05/29 职场文书
德劲DE1108畅想
2021/04/22 无线电