狄克斯特拉算法简介

狄克斯特拉算法是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题,但不能用于包含负权边的图。而广度优先搜索算法解决的是无权图中最短路径问题。
一般分为4个步骤:

1.找出最便宜的节点,即可在最短时间内前往的节点
2.对于该节点的邻居,检查是否有前往它们的最短路径,如果有,就更新其开销
3.重复这个过程,直到对图中的每个节点都这样做了
4.计算最终路径

实现最短路径的寻找,以下图为例

# 寻找开销最小节点的函数
def find_lowest_cost_node(costs):lowest_cost = float("inf")lowest_cost_node = None# 遍历所有节点for node in costs:cost = costs[node]# 如果当前节点的开销更低且未处理过if cost < lowest_cost and node not in processed:# 就将其视为开销最低的节点lowest_cost = costlowest_cost_node = nodereturn lowest_cost_nodeif __name__ == '__main__':graph = {}# 起点邻居及权重graph["start"] = {}graph["start"]["a"] = 6graph["start"]["b"] = 2# a节点邻居及权重graph["a"] = {}graph["a"]["fin"] = 1# b节点邻居及权重graph["b"] = {}graph["b"]["a"] = 3graph["b"]["fin"] = 5# 终点没有任何邻居graph["fin"] = {}# 存储开销的散列表,不知道开销的可以先设置为无穷大infinity = float("inf")costs = {}costs["a"] = 6costs["b"] = 2costs["fin"] = infinity# 存储父节点的散列表parents = {}parents["a"] = "start"parents["b"] = "start"parents["fin"] = None# 记录处理过的数组processed = []# 在未处理的节点中找出开销最小的节点node = find_lowest_cost_node(costs)# while循环在所有节点都被处理过后结束while node is not None:cost = costs[node]neighbors = graph[node]# 遍历当前节点的所有邻居for n in neighbors.keys():new_cost = cost + neighbors[n]# 如果经当前节点前往该邻居更近,就更新该邻居的开销if costs[n] > new_cost:costs[n] = new_cost# 将该邻居的父节点设置为当前节点parents[n] = node# 将当前节点标记为处理过processed.append(node)# 找出接下来要处理的节点,并循环node = find_lowest_cost_node(costs)
# 输出终点最短路径的父节点和开销
print("终点最短路径的父节点是:", parents["fin"])
print("终点最短路径的开销是:", costs["fin"])

实现结果

小结

1.广度优先搜索用于在非加权图中查找最短路径
2.狄克斯特拉算法用于在加权图中查找最短路径
3.仅当权重为正时狄克斯特拉算法才管用
4.如果图中包含负权边,请使用贝尔曼-福德算法

算法-狄克斯特拉算法相关推荐

  1. 算法 | 狄克斯特拉算法

    算法 | 狄克斯特拉算法 1. 简介 简介: 摘自百度百科 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路 ...

  2. 菜鸟学算法-狄克斯特拉算法

    什么是狄克斯特拉算法 狄克斯特拉算法用于解决有图的最短路径寻找,类似于深度优先算法,每次只走最短距离,走过的不在走,继续寻找最短距离,并不断更新到节点的开销-即是权重,保证开销最小才更新,最后所有节点 ...

  3. 最短路-弗洛伊德算法狄克斯特拉算法

    最短路 1.多源最短路 定义:现有n个地点,求任意两点间的最短距离 算法:弗洛伊德(floyd)算法 思想:让每一个点成为中转点,进行"松弛"操作: 所谓松弛操作就是要搞出 A+B ...

  4. 算法之狄克斯特拉算法 --《图解算法》

    2019你好!好好生活,好好工作! 狄克斯特拉算法 狄克斯特拉算法(Dijkstra )用于计算出不存在非负权重的情况下,起点到各个节点的最短距离 可用于解决2类问题: 从A出发是否存在到达B的路径: ...

  5. 《算法图解》学习笔记(七):狄克斯特拉算法(附代码)

    欢迎关注WX公众号:[程序员管小亮] python学习之路 - 从入门到精通到大师 文章目录 欢迎关注WX公众号:[程序员管小亮] [python学习之路 - 从入门到精通到大师](https://b ...

  6. 算法图解 第7章 狄克斯特拉算法

    本章内容 继续图的讨论,介绍加权图------提高或降低某些边的权重. 介绍狄克斯特拉算法,让你能够找出加权图中前往X的最短路径. 介绍图中的环,它导致狄克斯特拉算法不管用. 在前一章,你找出了从A点 ...

  7. 狄克斯特拉算法(入门)

    狄克斯特拉算法可以找出加权图中前往X的最短路径. 注意: - 其只适用于有向无环图 - 适用于正权边,负权边的将出错(贝尔曼-福德算法适用于负权边) 步骤: 找出当前最"便宜"的节 ...

  8. 小白的算法初识课堂(part7)--狄克斯特拉算法

    学习笔记 学习书目:<算法图解>- Aditya Bhargava 文章目录 狄克斯特拉算法 具体步骤实现 术语 跳蚤市场 具体步骤实现 负权边 python实现 狄克斯特拉算法 在上一个 ...

  9. 图解算法学习笔记(七):狄克斯特拉算法

    目录 1)使用狄克斯特拉算法 2)术语 3)实现 4)小结 本章内容; 介绍加权图,提高或降低某些边的权重: 介绍狄克斯特拉算法,找出加权图中前往X的最短路径: 介绍图中的环,它导致狄克斯特拉算法不管 ...

最新文章

  1. 图像数据集如何制作?增强??
  2. Ubuntu 14.04.1 配置 Android 源码开发环境(jdk版本切换)(转载)
  3. python hook教程_python中使用pyhook实现键盘监控的例子
  4. pandas 笔记:聚合函数agg
  5. springboot+mybatis整合shiro——登录认证和权限控制
  6. kali中wireshark打开后错误
  7. python测试代码运行时间_python测量代码运行时间方法
  8. UIScrollView的简单使用
  9. kaldi 源码分析(七) - HCLG 分析
  10. asp.net ashx处理程序中switch case的替代方案总结
  11. 分享一个强大的弹出框
  12. 更新 FF.PyAdmin v1.2
  13. unity素材一:奥日与黑暗森林风格2D场景
  14. @Aspect 注解使用详解
  15. 法国三家银行加入R3 Corda区块链贷款平台
  16. 视频:使用FFMpeg实现视频录制与压缩
  17. (附源码)springboot教材订购系统的开发毕业设计081419
  18. obs摄像头模糊_【OBS虚拟摄像头插件】OBS虚拟摄像头下载OBS VirtualCam v2020 官方版-趣致软件园...
  19. 逆滲透水與蒸餾水最不能喝
  20. 跨链技术如何破解区块链的可扩展性难题?

热门文章

  1. 机器学习数学基础——群论
  2. 你是这样的 CSS,19个唯美的边框
  3. 定点 浮点 神经网络 量化_神经网络模型量化论文小结
  4. 前端微服务化解决方案
  5. 安卓开发 java.lang.IllegalStateException isPlaying() 解决方案
  6. ACRUSH 楼教主的回忆录
  7. Win10:解决Win10的录音设备只能录制系统内部声音无法录制麦克风声音的问题
  8. 明确生产计划,做好生产进度跟踪
  9. [UOJ311]积劳成疾
  10. oracle 11g 导入\导出(expdp impdp)详解之导入