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连接池实现示例程序
Nov 26 Python
解决python写的windows服务不能启动的问题
Apr 15 Python
Python删除空文件和空文件夹的方法
Jul 14 Python
浅谈python抛出异常、自定义异常, 传递异常
Jun 20 Python
python爬取各类文档方法归类汇总
Mar 22 Python
Django 创建新App及其常用命令的实现方法
Aug 04 Python
2020新版本pycharm+anaconda+opencv+pyqt环境配置学习笔记,亲测可用
Mar 24 Python
python基本算法之实现归并排序(Merge sort)
Sep 01 Python
python使用smtplib模块发送邮件
Dec 17 Python
如何在vscode中安装python库的方法步骤
Jan 06 Python
python 如何做一个识别率百分百的OCR
May 29 Python
JAVA SpringMVC实现自定义拦截器
Mar 16 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利用header函数实现文件下载时直接提示保存
2009/11/12 PHP
Cakephp 执行主要流程
2010/03/24 PHP
php中导出数据到excel时数字变为科学计数的解决方法
2013/02/03 PHP
PHP使用range协议实现输出文件断点续传代码实例
2014/07/04 PHP
PHP基于DOM创建xml文档的方法示例
2017/02/08 PHP
javascript转换字符串为dom对象(字符串动态创建dom)
2010/05/10 Javascript
Javascript 面向对象 命名空间
2010/05/13 Javascript
jquery与prototype框架的详细对比
2013/11/21 Javascript
Extjs4中的分页应用结合前后台
2013/12/13 Javascript
JS自调用匿名函数具体实现
2014/02/11 Javascript
node.js适合游戏后台开发吗?
2014/09/03 Javascript
使用Angular.js开发的注意事项
2016/10/19 Javascript
js正则表达式惰性匹配和贪婪匹配用法分析
2016/12/26 Javascript
angularjs实现的购物金额计算工具示例
2018/05/08 Javascript
基于JS实现带动画效果的流程进度条
2018/06/01 Javascript
JS中使用cavas截图网页并解决跨域及模糊问题
2018/11/13 Javascript
基于JavaScript判断两个对象内容是否相等
2020/01/10 Javascript
Vue中多元素过渡特效的解决方案
2020/02/05 Javascript
使用Vue-cli 中为单独页面设置背景图片铺满全屏
2020/07/17 Javascript
vue实现lodop打印功能的示例
2020/11/11 Javascript
Python常用内置函数总结
2015/02/08 Python
python实用代码片段收集贴
2015/06/03 Python
Django实现一对多表模型的跨表查询方法
2018/12/18 Python
pandas 选取行和列数据的方法详解
2019/08/08 Python
Python 获取指定文件夹下的目录和文件的实现
2019/08/30 Python
CSS3中线性颜色渐变的一些实现方法
2015/07/14 HTML / CSS
应届生简历中的自我评价
2014/01/13 职场文书
餐饮投资计划书
2014/04/25 职场文书
代领报检证委托书范本
2014/10/11 职场文书
个人廉政承诺书
2015/04/28 职场文书
2015年领导班子工作总结
2015/05/23 职场文书
2015年大学迎新晚会总结
2015/07/16 职场文书
参加招聘会后的感想
2015/08/10 职场文书
2016特色励志班级口号
2015/12/24 职场文书
《确定位置》教学反思
2016/02/18 职场文书
MySQL连接查询你真的学会了吗?
2021/06/02 MySQL