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网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)
Jun 09 Python
python转换字符串为摩尔斯电码的方法
Jul 06 Python
python去除字符串中的换行符
Oct 11 Python
python-docx修改已存在的Word文档的表格的字体格式方法
May 08 Python
python 解决动态的定义变量名,并给其赋值的方法(大数据处理)
Nov 10 Python
Python正则表达式实现简易计算器功能示例
May 07 Python
django如何实现视图重定向
Jul 24 Python
flask实现验证码并验证功能
Dec 05 Python
python 按钮点击关闭窗口的实现
Mar 04 Python
Django+boostrap 美化admin后台的操作
Mar 11 Python
Python实现加密接口测试方法步骤详解
Jun 05 Python
如何利用python实现Simhash算法
Jun 28 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和ACCESS写聊天室(五)
2006/10/09 PHP
php输出xml格式字符串(用的这个)
2012/07/12 PHP
codeigniter教程之上传视频并使用ffmpeg转flv示例
2014/02/13 PHP
PHP判断一个字符串是否是回文字符串的方法
2015/03/23 PHP
PHP mysqli事务操作常用方法分析
2017/07/22 PHP
javascript 网页跳转的方法
2008/12/24 Javascript
js实现在字符串中提取数字
2013/11/05 Javascript
jquery放大镜效果超漂亮噢
2013/11/15 Javascript
textarea 控制输入字符字节数(示例代码)
2013/12/27 Javascript
javascript 回调函数详解
2014/11/11 Javascript
JavaScript对象之深度克隆介绍
2014/12/08 Javascript
js实现iPhone界面风格的单选框和复选框按钮实例
2015/08/18 Javascript
轻松实现javascript数据双向绑定
2015/11/11 Javascript
原生js轮播特效
2017/05/18 Javascript
使用JavaScript进行表单校验功能
2017/08/01 Javascript
浅谈React之状态(State)
2018/09/19 Javascript
浅谈高大上的微信小程序中渲染html内容—技术分享
2018/10/25 Javascript
vue-cli配置flexible过程详解
2019/07/04 Javascript
JS sort方法基于数组对象属性值排序
2020/07/10 Javascript
Element Rate 评分的使用方法
2020/07/27 Javascript
[01:03:38]2014 DOTA2国际邀请赛中国区预选赛5.21 CNB VS CIS
2014/05/22 DOTA
[01:46]2018完美盛典章节片——坚守
2018/12/17 DOTA
Python利用IPython提高开发效率
2016/08/10 Python
Python遍历某目录下的所有文件夹与文件路径
2018/03/15 Python
设置python3为默认python的方法
2018/10/31 Python
python实现将多个文件分配到多个文件夹的方法
2019/01/07 Python
Python程序慢的重要原因
2020/09/04 Python
Strawberrynet草莓网新加坡站:护肤、彩妆、香水及美发产品
2018/08/31 全球购物
教师考核评语大全
2014/12/31 职场文书
二手房购房意向书
2015/05/09 职场文书
2015年政府采购工作总结
2015/05/21 职场文书
2016暑期社会实践新闻稿
2015/11/25 职场文书
2019消防宣传标语!
2019/07/10 职场文书
MySQL COUNT函数的使用与优化
2021/05/10 MySQL
Android Studio实现带三角函数对数运算功能的高级计算器
2022/05/20 Java/Android
html,css,javascript是怎样变成页面的
2023/05/07 HTML / CSS