当前位置: 首页 > news >正文

算法-Dijkstra算法-02 - jack

目录
  • Dijkstra算法
  • 概念
  • 算法工作原理
  • 代码

参考:https://blog.csdn.net/u011426016/article/details/140895213

Dijkstra算法

Dijkstra算法是一种用于解决单源最短路径问题的贪婪算法。
它的主要目标是在一个有向或无向的、边权重为非负数的图中,找到从一个起始顶点到所有其他顶点的最短路径。
想象一下您正在使用GPS导航,Dijkstra算法就像是导航系统在寻找从您的位置(起始点)到所有可能目的地的最快(或最短)路线。

概念

在理解Dijkstra算法之前,我们需要先了解几个基本的图论概念:

图(Graph): 由顶点(Vertex)和边(Edge)组成。
顶点(Vertex): 图中的节点。
边(Edge): 连接两个顶点的线。
权重(Weight): 边上的值,代表了通过这条边的“代价”,比如距离、时间或费用。Dijkstra算法要求所有边的权重都必须是非负数。
路径(Path): 从一个顶点到另一个顶点经过的一系列边。
最短路径(Shortest Path): 在所有可能的路径中,权重之和最小的那条路径。

算法工作原理

Dijkstra算法的核心思想是:从起点开始,一步步向外“扩张”,每次都选择一个当前已知的、离起点最近的未访问过的顶点,并更新其所有邻居的距离。
类似水波一样逐渐的扩散
步骤:

1.初始化:
创建一个距离字典(或数组),用于存储从起点到每个顶点的当前最短距离。将起点的距离设为0,所有其他顶点的距离设为无穷大(代表目前还无法到达)。
创建一个集合来存放已经访问过的顶点。
使用一个优先队列(Min-Heap)来存储待处理的顶点,队列中的元素是 (距离, 顶点) 的元组,并且总是弹出距离最小的那个。

2.开始循环:
将起点及其距离 (0, start_node) 放入优先队列中。
当优先队列不为空时,重复以下步骤:

3.选择下一个顶点:
从优先队列中取出距离最小的顶点 u。

4.判断访问状态:
如果 u 已经被访问过,则跳过,因为我们已经找到了从起点到 u 的最短路径。
如果 u 未被访问过,将其标记为已访问。

5.更新邻居距离:
遍历 u 的所有邻居 v
计算从起点到 u,再到 v 的新路径距离:new_distance = distance[u] + weight(u, v)。
如果 new_distance 小于目前已知的从起点到 v 的距离 distance[v],则:
更新 distance[v] 为 new_distance。
将 (new_distance, v) 放入优先队列中。

  1. 结束
    当优先队列为空时,算法结束。此时,距离字典中存储的就是从起点到所有可达顶点的最短路径长度。

代码

import heapqdef dijkstra(graph, start_node):"""使用优先队列实现Dijkstra算法,找到从起始节点到所有其他节点的最短路径。Args:graph: 使用字典表示的图。例如:{'A': {'B': 1, 'C': 4}, 'B': {'A': 1, 'C': 2, 'D': 5}, ...}其中,键是节点,值是另一个字典,表示邻居和对应的边权重。start_node: 起始节点的名称。Returns:一个字典,包含从起始节点到所有可达节点的最短距离。"""# 1. 初始化距离字典,将所有距离设置为无穷大,起始点距离为0distances = {node: float('inf') for node in graph}distances[start_node] = 0# 2. 初始化优先队列,将起始节点及其距离放入# 优先队列中的元素是 (距离, 节点)priority_queue = [(0, start_node)]# 3. 存储已访问过的节点visited = set()while priority_queue:# 4. 从优先队列中弹出距离最小的节点current_distance, current_node = heapq.heappop(priority_queue)# 5. 如果当前节点已被访问,跳过if current_node in visited:continue# 6. 标记当前节点为已访问visited.add(current_node)# 7. 遍历当前节点的所有邻居for neighbor, weight in graph[current_node].items():# 计算通过当前节点到达邻居的新距离distance = current_distance + weight# 如果新距离比已知的距离更短,则更新并放入优先队列if distance < distances[neighbor]:distances[neighbor] = distanceheapq.heappush(priority_queue, (distance, neighbor))return distances# 示例图
# A ---1--- B ---2--- C
# |         | \       |
# 4         2  \      7
# |         |   \     |
# D ---5--- E ----6---F
# B到E的边权重为3
example_graph = {'A': {'B': 1, 'D': 4},'B': {'A': 1, 'C': 2, 'E': 3},'C': {'B': 2, 'F': 7},'D': {'A': 4, 'E': 5},'E': {'B': 3, 'D': 5, 'F': 6},'F': {'C': 7, 'E': 6}
}# 运行Dijkstra算法,从节点'A'开始
shortest_paths = dijkstra(example_graph, 'A')# 打印结果
print("从节点 'A' 到其他节点的最短距离:")
for node, distance in shortest_paths.items():if distance == float('inf'):print(f"  到节点 {node}: 无法到达")else:print(f"  到节点 {node}: {distance}")
从节点 'A' 到其他节点的最短距离:到节点 A: 0到节点 B: 1到节点 C: 3到节点 D: 4到节点 E: 4到节点 F: 10

就这么简单!!

http://www.sczhlp.com/news/90499/

相关文章:

  • 浙江省网站icp备案wordpress怎么恢复默然设置
  • 大型免费网站制作开通网站申请
  • 什么网站可以赚钱啊做网站原则
  • 潍坊网站建设推荐做网站怎么提取视频无广告
  • 高端网站有哪些上海有什么互联网公司
  • 宁波住房建设局网站网站不换域名换空间
  • pc端软件下载梧州自助建站seo
  • 合肥专业做网站公司哪家好网站免费的有没有
  • 内蒙古城乡住房建设厅网站做红酒闪购的网站有哪些
  • 网站建设的切片是什么江苏建设人才无纸化考核网站
  • 1688网站特点wordpress分类页面的地址
  • typescript面试题
  • 网站建设 ipc备案中国肩章
  • 网站开发质量控制计划如何个人创建微信公众号
  • 福田保安公司招聘北京seo实战培训班
  • 怎么优化自己网站网络口碑营销的成功案例
  • 网站开发如何避开法律网站设计 优帮云
  • 网站ico如何修改网络服务商主要包括哪些
  • LIN通信协议入门
  • 网站开发周期定义网站维护和建设实报告
  • 做英文版网站seo优化业务员招聘
  • 网站添加设置着陆页网页制作技术基础教程
  • 软件网站开发公司如何做淘宝客的网站
  • 国际域名查询网站page n wordpress
  • 如何提高网站排名外国网站怎么进入
  • 网站支付可以做二清网站开发开始阶段的主要任务包括( )。
  • 柳州公司网站建设文本网站开发英文文献
  • wordpress全站加密杭州优化网站
  • 网站认证是什么意思文章页模板wordpress
  • 答题赚现金程序介绍