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使用win32com在百度空间插入html元素示例
Feb 20 Python
python基于ID3思想的决策树
Jan 03 Python
python绘制热力图heatmap
Mar 23 Python
Python Matplotlib库安装与基本作图示例
Jan 09 Python
在Pycharm中对代码进行注释和缩进的方法详解
Jan 20 Python
Python下简易的单例模式详解
Apr 08 Python
python 弹窗提示警告框MessageBox的实例
Jun 18 Python
浅谈Python type的使用
Nov 19 Python
Python实现变声器功能(萝莉音御姐音)
Dec 05 Python
python3 webp转gif格式的实现示例
Dec 10 Python
使用python-Jenkins批量创建及修改jobs操作
May 12 Python
python中rc1什么意思
Jun 19 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
is_uploaded_file函数引发的不能上传文件问题
2013/10/29 PHP
php分页函数示例代码分享
2014/02/24 PHP
详解WordPress中创建和添加过滤器的相关PHP函数
2015/12/29 PHP
Symfony实现行为和模板中取得request参数的方法
2016/03/17 PHP
PHP模板引擎Smarty内建函数section,sectionelse用法详解
2016/04/11 PHP
PHP封装的完整分页类示例
2018/08/21 PHP
浅谈php://filter的妙用
2019/03/05 PHP
web性能优化之javascript性能调优
2012/12/28 Javascript
jQuery实现类似老虎机滚动抽奖效果
2015/08/06 Javascript
vue.js入门教程之绑定class和style样式
2016/09/02 Javascript
AngularJS的依赖注入实例分析(使用module和injector)
2017/01/19 Javascript
JavaScript 实现 Tab 点击切换实例代码
2017/03/25 Javascript
Javascript实现一个简单的输入关键字添加标签效果实例
2017/06/01 Javascript
解决在vue+webpack开发中出现两个或多个菜单公用一个组件问题
2017/11/28 Javascript
nuxt.js 缓存实践
2018/06/25 Javascript
vue.js中proxyTable 转发请求的实现方法
2018/09/20 Javascript
JQuery发送ajax请求时中文乱码问题解决
2019/11/14 jQuery
重置Redux的状态数据的方法实现
2019/11/18 Javascript
浅谈element中InfiniteScroll按需引入的一点注意事项
2020/06/05 Javascript
Python 数据结构之堆栈实例代码
2017/01/22 Python
python opencv3实现人脸识别(windows)
2018/05/25 Python
Tensorflow实现酸奶销量预测分析
2019/07/19 Python
Django 源码WSGI剖析过程详解
2019/08/05 Python
Python3实现二叉树的最大深度
2019/09/30 Python
python推导式的使用方法实例
2021/02/28 Python
Python .py生成.pyd文件并打包.exe 的注意事项说明
2021/03/04 Python
解决PDF 转图片时丢文字的一种可能方式
2021/03/04 Python
浅谈html5与APP混合开发遇到的问题总结
2018/03/20 HTML / CSS
应届生法律顾问求职信
2013/11/19 职场文书
区域销售经理职责
2013/12/22 职场文书
委托公证书
2014/04/08 职场文书
党日活动总结
2014/05/07 职场文书
精神文明建设先进个人事迹材料
2014/12/24 职场文书
2015年妇幼保健工作总结
2015/05/19 职场文书
校园之声广播稿
2015/08/18 职场文书
Pycharm 如何设置HTML文件自动补全代码或标签
2021/05/21 Python