狄克斯特拉算法可以找出加权图中前往X的最短路径。

注意:
- 其只适用于有向无环图
- 适用于正权边,负权边的将出错(贝尔曼—福德算法适用于负权边)

步骤:

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

实例:

# coding=utf-8# 图表
graph = {}
graph["start"] = {}
graph["start"]["a"] = 6  # 开始节点的邻居和邻居的开销
graph["start"]["b"] = 2graph["a"] = {}  # a节点的邻居和邻居的开销
graph["a"]["fin"] = 1  graph["b"] = {}  # b节点的邻居和邻居的开销
graph["b"]["a"] = 3
graph["b"]["fin"] = 5graph["fin"] = {}  # 终点的邻居和邻居的开销# 节点的开销散列表
infinity = float("inf")
costs = {}
costs["a"] = 6  # 这时你可能找到更短的路径,但没有影响
costs["b"] = 2
costs["fin"] = infinity
#print infinity# 父节点的散列表
parents = {}
parents["a"] = "start"
parents["b"] = "start"
parents["fin"] = None# 处理过的节点列表
processed = []# 查找开销最小的节点
def find_lowest_cost_node(costs):lowest_cost = float("inf")  # python中表示无穷大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 = node # 替换目前最小开销的节点return lowest_cost_node  # 返回目前最小开销的节点node = find_lowest_cost_node(costs)  # 未处理的节点中找到开销最小的点
print 'lowest_cost_node:',node
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 'lowest_cost_node:',nodeprint "Cost from the start to each node:"
print 'parents:',parents
print costs

结果:

=========== RESTART: C:\Users\LiLong\Desktop\Algorithm\dixstrah.py ===========
lowest_cost_node: b
lowest_cost_node: a
lowest_cost_node: fin
lowest_cost_node: None
Cost from the start to each node:
parents: {'a': 'b', 'b': 'start', 'fin': 'a'}
{'a': 5, 'b': 2, 'fin': 6}
>>> 

可以看出最短路径:

start→2bstart→3astart→1fin

start\overset{2}{\rightarrow} b start\overset{3}{\rightarrow} a start\overset{1}{\rightarrow}fin

开销是:6


参考:《算法图解》—Aditya Bhargava
适合入门的看,讲的很基础,很多形象插图

狄克斯特拉算法(入门)相关推荐

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

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

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

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

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

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

  4. 算法(四):图解狄克斯特拉算法

    算法简介 狄克斯特拉算法(Dijkstra )用于计算出不存在非负权重的情况下,起点到各个节点的最短距离 可用于解决2类问题: 从A出发是否存在到达B的路径: 从A出发到达B的最短路径(时间最少.或者 ...

  5. 《算法图解》——狄克斯特拉算法

    前面文章提到,找出段数最少的路径,使用广度优先搜索. 现在要找出最快的路径,(花费最少)使用狄克斯特拉算法. 狄克斯特拉算法包含的四个步骤: (1)找出最便宜的节点,即可在最短时间内前往的节点. (2 ...

  6. 算法图解之狄克斯特拉算法实现

    狄克斯特拉算法用于在加权图中查找最短路径(权重不能为负) '''实现狄克斯特拉算法''' graph = {} graph['start'] = {}#在散列表graph中再建一个散列表为start, ...

  7. 算法学习之狄克斯特拉算法

    加权图 在了解狄克斯特拉算法之前,先介绍一下加权图. 如图,假设你要从起点出发到达终点,如果只考虑换乘少,即最短路径.那么可以使用广度优先搜索算法,该算法我之前简单的写过,链接点这里.但是,现在你要找 ...

  8. 初学狄克斯特拉算法~(待提高)

    读书笔记 狄克斯特拉算用来寻找加权图的"最短路径"(不一定是段数最少,我们需要一定的量度,比如说最少花费,最短时间等,bfs只是解决了段数的最短路径问题) 鉴于无向图就是一个环,而 ...

  9. Python查找算法之狄克斯特拉算法

    目录 简介 加权图 非加权图 思路 实例 代码步骤 代码示例 运行结果 简介 狄克斯特拉算法解决了耗时最短(总权重最小)问题狄克斯特拉算法适用于加权图,并且图为有向无环图(DAG),而且权重不能为负数 ...

最新文章

  1. 在像Angular2这样的SPA应用中使用Google Analytics的方法
  2. python 3.0内置函数map、filter
  3. stm32核心板可以点亮灯吗_STM32库函数点亮LED
  4. unittest+discover批量处理自动化脚本
  5. 消息系统kafka原理解析
  6. jQuery实现的简单分页功能的详细解析
  7. excel 表生成insert语句。
  8. Win7系统下调整硬盘分区大小给C盘更多的空间
  9. Visual Studio 2015打开ASP.NET MVC的View提示“Object reference not set to an instance of an object“错误的解决方案
  10. git新建和删除远程分支
  11. [SPLEB]CodeSmith原理剖析(2)
  12. 百度网盘加速下载Motrix多线程下载器
  13. 转基因,请你走出这片净土。!!!食用转基因的人,你们伤不起~有木有,有木有啊~!!!!!!!!!!!!!!!
  14. 初识软件工程-软件工程的产生与发展
  15. 【软件测试】盘一盘工作中遇到的 MQ 异常测试
  16. udt4 VS udt gateway
  17. python中一个星号(*)与两个星号(**)的作用
  18. systemctl status mysqld.service或者systemctl start mysqld 启动失败的解决办法
  19. 工业4.0时代读后感
  20. Linux搭建一个网站,实现局域网访问

热门文章

  1. OpenCV文件输入输出的序列化功能的实例(附完整代码)
  2. C语言查找单链列表的第k个元素的算法(附完整源码)
  3. OpenGL Deferred Shading延迟阴影实例
  4. C++ edit distances最小编辑距离(附完整源码)
  5. QT的QMutableMapIterator类的使用
  6. QML基础类型之point
  7. boot spring 怎么执行hql_spring-boot 中使用graphql的正确姿势
  8. 下pg负载均衡_SAE 场景下,应用流量的负载均衡及路由策略配置实践
  9. MySQL里面json_MySQL中的JSON
  10. 开源的ESB产品列表信息