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入门篇之正则表达式
Oct 20 Python
实践Vim配置python开发环境
Jul 02 Python
python bmp转换为jpg 并删除原图的方法
Oct 25 Python
python直接获取API传递回来的参数方法
Dec 17 Python
python matplotlib实现双Y轴的实例
Feb 12 Python
将Python文件打包成.EXE可执行文件的方法
Aug 11 Python
Python使用python-docx读写word文档
Aug 26 Python
详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
Apr 01 Python
解决pycharm下pyuic工具使用的问题
Apr 08 Python
python rolling regression. 使用 Python 实现滚动回归操作
Jun 08 Python
详解Python 中的容器 collections
Aug 17 Python
python输出国际象棋棋盘的实例分享
Nov 26 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
Windows Apache2.2.11及Php5.2.9-1的安装与配置方法
2009/06/08 PHP
IP攻击升级,程序改进以对付新的攻击
2010/11/23 PHP
PHP中如何实现常用邮箱的基本判断
2014/01/07 PHP
php计算两个日期时间差(返回年、月、日)
2014/06/19 PHP
ThinkPHP之import方法实例详解
2014/06/20 PHP
CI(Codeigniter)的Setting增强配置类实例
2016/01/06 PHP
PHP书写格式详解(必看)
2016/05/23 PHP
通过jquery的$.getJSON做一个跨域ajax请求试验
2011/05/03 Javascript
三级下拉菜单的js实现代码
2011/05/23 Javascript
jquery延迟加载外部js实现代码
2013/01/11 Javascript
7款风格新颖的jQuery/CSS3菜单导航分享
2013/04/23 Javascript
对 jQuery 中 data 方法的误解分析
2014/06/18 Javascript
js实现二代身份证号码验证详解
2014/11/20 Javascript
Javascript添加监听与删除监听用法详解
2014/12/19 Javascript
基于JavaScript实现仿京东图片轮播效果
2015/11/06 Javascript
JavaScript事件类型中UI事件详解
2016/01/14 Javascript
原生JS实现垂直手风琴效果
2017/02/19 Javascript
详解如何配置vue-cli3.0的vue.config.js
2018/08/23 Javascript
Angular8 实现table表格表头固定效果
2020/01/03 Javascript
实现一个Vue自定义指令懒加载的方法示例
2020/06/04 Javascript
详解js中的原型,原型对象,原型链
2020/07/16 Javascript
python获取当前运行函数名称的方法实例代码
2017/04/06 Python
python绘制圆柱体的方法
2018/07/02 Python
python面向对象入门教程之从代码复用开始(一)
2018/12/11 Python
python中的&amp;&amp;及||的实现示例
2019/08/07 Python
Pyspark读取parquet数据过程解析
2020/03/27 Python
python中加背景音乐如何操作
2020/07/19 Python
Python与C/C++的相互调用案例
2021/03/04 Python
css3实现3D色子翻转特效
2014/12/23 HTML / CSS
小狗电器官方商城:中国高端吸尘器品牌
2017/03/29 全球购物
Audible英国:有声读物,30天免费试用
2019/10/16 全球购物
大一期末自我鉴定
2013/12/13 职场文书
求职信格式要求
2014/05/23 职场文书
三年级学生期末评语
2014/12/26 职场文书
教师个人成长总结
2015/02/11 职场文书
postgreSQL数据库基础知识介绍
2022/04/12 PostgreSQL