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中实现参数类型检查的简单方法
Apr 21 Python
Django 添加静态文件的两种实现方法(必看篇)
Jul 14 Python
python利用正则表达式搜索单词示例代码
Sep 24 Python
pytorch使用Variable实现线性回归
May 21 Python
python3.x+pyqt5实现主窗口状态栏里(嵌入)显示进度条功能
Jul 04 Python
python 提取文件指定列的方法示例
Aug 07 Python
python实现的读取网页并分词功能示例
Oct 29 Python
centos+nginx+uwsgi+Django实现IP+port访问服务器
Nov 15 Python
关于ZeroMQ 三种模式python3实现方式
Dec 23 Python
使用PyOpenGL绘制三维坐标系实例
Dec 24 Python
Python Numpy,mask图像的生成详解
Feb 19 Python
python垃圾回收机制原理分析
Apr 13 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在各种web服务器的运行模式详解
2013/06/03 PHP
9条PHP编程小知识及易犯的小错误
2015/01/22 PHP
php微信公众平台开发类实例
2015/04/01 PHP
php截取指定2个字符之间字符串的方法
2015/04/15 PHP
PHP创建多级目录的两种方法
2016/10/28 PHP
PHP基础之输出缓冲区基本概念、原理分析
2019/06/19 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
2020/04/04 PHP
javascript 面向对象编程基础 多态
2009/08/21 Javascript
JQuery在光标位置插入内容的实现代码
2010/06/18 Javascript
jquery $.ajax相关用法分享
2012/03/16 Javascript
javascript的内存管理详解
2013/08/07 Javascript
node.js中的fs.fchown方法使用说明
2014/12/16 Javascript
jQuery 回调函数(callback)的使用和基础
2015/02/26 Javascript
JavaScript事件委托实例分析
2015/05/26 Javascript
详解基于Bootstrap扁平化的后台框架Ace
2015/11/27 Javascript
原生js的数组除重复简单实例
2016/05/24 Javascript
jQuery中常用动画效果函数(日常整理)
2016/09/17 Javascript
详解使用vscode+es6写nodejs服务端调试配置
2017/09/21 NodeJs
ES6 迭代器(Iterator)和 for.of循环使用方法学习(总结)
2018/02/08 Javascript
angular8和ngrx8结合使用的步骤介绍
2019/12/01 Javascript
vue 递归组件的简单使用示例
2021/01/14 Vue.js
[03:45]Newbee战队出征西雅图 决战2016国际邀请赛
2016/08/02 DOTA
python 读取视频,处理后,实时计算帧数fps的方法
2018/07/10 Python
python解析xml简单示例
2019/06/21 Python
Python中print函数简单使用总结
2019/08/05 Python
Python如何使用函数做字典的值
2019/11/30 Python
Python pygame绘制文字制作滚动文字过程解析
2019/12/12 Python
python基于爬虫+django,打造个性化API接口
2021/01/21 Python
英国领先的在线旅游和休闲零售商:lastminute.com
2019/01/23 全球购物
护士自我鉴定范文
2013/10/06 职场文书
房地产公司见习自我鉴定
2014/04/28 职场文书
公司总经理岗位职责范本
2014/08/15 职场文书
2014幼儿园教师师德师风演讲稿
2014/09/10 职场文书
法人授权委托书范本
2014/09/17 职场文书
两行代码解决Jupyter Notebook中文不能显示的问题
2021/04/24 Python
CSS实现渐变色边框(Gradient borders)的5种方法
2022/03/25 HTML / CSS