尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

算法-Dijkstra算法-02 - jack

算法-Dijkstra算法-02 - jack
📅 发布时间:2026/6/19 18:44:46

目录
  • 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

就这么简单!!

相关新闻

  • typescript面试题
  • 答题赚现金程序介绍
  • framework中按压power键屏幕熄灭及亮起时流程

最新新闻

  • Qwen3vl多模态后训练实战:LLamaFactory深度适配指南
  • 国产MLU算网+LLaMA-Factory:零代码微调百余大模型实战指南
  • 猫抓插件:3步搞定浏览器资源嗅探的终极指南
  • MPC866双核通信处理器架构解析与嵌入式网络设备开发实战
  • 存储型XSS漏洞实战解析:从DVWA靶场到安全防御
  • SRC漏洞挖掘实战:从信息搜集到逻辑漏洞的完整攻防指南

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号