Dijkstra算法

迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。

迪杰斯特拉算法是求从某一个起点到其余所有结点的最短路径,是一对多的映射关系,是一种贪婪算法

示例:

算法

算法实现流程思路:

迪杰斯特拉算法每次只找离起点最近的一个结点,并将之并入已经访问过结点的集合(以防重复访问,陷入死循环),然后将刚找到的最短路径的结点作为中间结点来更新相邻结点的路径长度,这样循环找到图中一个个结点的最短路径。

"""

输入

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实现ks算法_Python实现Dijkstra算法相关推荐

  1. 自动寻路算法python_关于Dijkstra算法和其他的一些图算法(Johnson, Floyd-Warshall, A*)解决最短路径问题的方法的Python实现。...

    这篇文章其实主要想说的是如何解决最短路径的问题. 其实最短路径问题,我们在生活中都在不知不觉的使用.比如我们在上网的时候,互联网传输采用了各种各样的数据包路由方法.这些路由算法都在幕后工作. 还有一些 ...

  2. 遍历所有点的最短路径python_图遍历算法之最短路径Dijkstra算法

    一.最短路径问题(shortest path problem) 最短路径问题是图论研究中一个经典算法问题,旨在寻找图中两节点或单个节点到其他节点之间的最短路径.根据问题的不同,算法的具体形式包括: 确 ...

  3. 数据结构最短路径例题_编程小白暑期进阶笔记45-C语言数据结构与算法最短路径和dijkstra算法...

    最短路径 算法特点: 迪科斯彻算法使用了广度优先搜索解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树.该算法常用于路由算法或者作为其他图算法的一个子模块. 算法思路: Dijks ...

  4. python自动寻路算法_python实现Dijkstra静态寻路算法

    算法介绍 迪科斯彻算法使用了广度优先搜索解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树.该算法常用于路由算法或者作为其他图算法的一个子模块. 当然目前也有人将它用来处理物流方面 ...

  5. python sort 部分元素_Python 简单排序算法-选择、冒泡、插入排序实现

    写文章主要是记录自己每天学习的东西,本篇文章主要介绍数据结构中常用的简单的排序算法,虽然这些算法用Python实现起来不是十分的高效,不如c.java之类的运行速度快,应用Python实现主要是为了: ...

  6. python实现排列组合公式算法_Python实现卡尔曼滤波算法之贝叶斯滤波

    Python实现卡尔曼滤波算法之贝叶斯滤波 作者:yangjian 卡尔曼滤波器属于贝叶斯滤波器的一种特例,本文主要讲解贝叶斯滤波原理及其算法的python实现. 先来看下贝叶斯公式 贝叶斯公式 :后 ...

  7. python中值滤波算法_Python实现卡尔曼滤波算法之贝叶斯滤波

    Python实现卡尔曼滤波算法之贝叶斯滤波 作者:yangjian 卡尔曼滤波器属于贝叶斯滤波器的一种特例,本文主要讲解贝叶斯滤波原理及其算法的python实现. 先来看下贝叶斯公式 贝叶斯公式 :后 ...

  8. python谱聚类算法_Python机器学习高级算法!谱聚类(Spectal Clustering)算法分析和实例详解...

    谱聚类(Spectal Clustering)算法是聚类算法的一种,比起传统的K-Means聚类算法,谱聚类算法的效果更优秀,其计算量也小很多,除了谱聚类和K-Means聚类算法,另外还有密度聚类和层 ...

  9. 【爬虫、算法】基于Dijkstra算法的武汉地铁路径规划!

    作者:牧小熊,华中农业大学,Datawhale原创作者 前言 最近爬取了武汉地铁线路的信息,通过调用高德地图的api 获得各个站点的进度和纬度信息,使用Dijkstra算法对路径进行规划. 1.数据爬 ...

最新文章

  1. 微博并发这么牛逼!看他架构如何设计的?
  2. 计算机书籍-语音识别技术实践
  3. qtablewidget 数据量大效率很低_让大牛带你走进大数据分析:R基础及应用的潮流尖端,享受RHadoop...
  4. python入门到精通需要学多久-Python从入门到精通只需要一个月就够了!
  5. 由作用域安全的构造函数想到的
  6. 使用脚手架应用做单元测试
  7. 本地缓存之Guava简单使用
  8. 百度云服务器最新活动,百度云服务器1折_云服务器超值优惠_特价云服务器促销活动-天互数据...
  9. Atitit.如何建立研发体系
  10. android markdown编辑器,推荐几款好用的Markdown编辑器
  11. 常见设计稿字体对应字重font-weight大小
  12. opencv 毛星云c++版本复习
  13. linux如何查看内存命令
  14. 使用three.js创建一个正方体
  15. 微信 及支付宝 支付接口 功能
  16. ajax 模糊查询,ajax模糊查询api
  17. android 广告库sdk,GitHub - adxdata/sdk-android-demo: 美数广告SDK(Android)示例
  18. 手机上测试空气质量的软件,PM2.5指数爆表:6款PM2.5手机查询软件实时监测空气质量...
  19. codeforces 616F Expensive Strings
  20. PyCharm安装与配置

热门文章

  1. 【bzoj 4764】弹飞大爷
  2. 数据库连接查询 变量 运算符
  3. Sizzle引擎--原理与实践(二)
  4. Ubuntu中Apache修改DocumentRoot(修改网站根目录)
  5. XSLT基本语法和第一个实例
  6. Promethus+Grafana监控解决方案
  7. Laravel 中的异常处理
  8. traceback异常打印
  9. npm i -g windows-build-tools安装出错解决方法
  10. JavaScript中的instanceof运算符是什么?