Dijkstra 算法

Dijkstra 算法用来计算边权均非负的单源最短路径算法。

Dijkstra 算法简介

Dijkstra 算法是一种用于在加权图中找到单源最短路径的贪心算法,适用于边权非负的图。其核心思想是通过逐步扩展已知最短路径的顶点集合,最终得到从源点到所有其他顶点的最短路径。


算法步骤

  1. 初始化

    • 创建一个距离数组 dist[]dist[v] 表示源点到顶点 v 的当前最短距离。初始时,dist[源点] = 0,其余顶点为无穷大()。
    • 创建一个优先队列(最小堆)或未处理顶点集合,用于存储待处理的顶点。
  2. 选择未处理顶点中距离最小的顶点

    • 从优先队列中取出距离最小的顶点 u,标记为已处理。
  3. 松弛操作(Relaxation)

    • 遍历 u 的所有邻接顶点 v,检查是否通过 u 可以缩短到 v 的距离:
      • dist[u] + weight(u, v) < dist[v],则更新 dist[v]dist[u] + weight(u, v)
      • v 加入优先队列(若未处理)。
  4. 重复步骤 2-3

    • 直到所有顶点均被处理或优先队列为空。

伪代码实现

复制代码
def dijkstra(graph, source):
    dist = {v: float('infinity') for v in graph}
    dist[source] = 0
    priority_queue = [(0, source)]
    visited = set()

    while priority_queue:
        current_dist, u = heapq.heappop(priority_queue)
        if u in visited:
            continue
        visited.add(u)
        
        for v, weight in graph[u].items():
            if dist[v] > current_dist + weight:
                dist[v] = current_dist + weight
                heapq.heappush(priority_queue, (dist[v], v))
    
    return dist

时间复杂度

  • 优先队列实现 (如二叉堆):
    • 时间复杂度为 O((V + E) \\log V),其中 V 为顶点数,E 为边数。
  • 数组实现 (未优化):
    • 时间复杂度为 O(V\^2),适用于稠密图。

应用场景

  1. 路由协议(如 OSPF)。
  2. 地图导航中的最短路径规划。
  3. 网络延迟分析。

注意事项

  • 仅适用于边权非负的图。若存在负权边,需使用 Bellman-Ford 算法。
  • 稠密图中,使用斐波那契堆可将时间复杂度优化至 O(E + V \\log V)

示例

假设有以下加权图(邻接表表示):

复制代码
graph = {
    'A': {'B': 1, 'C': 4},
    'B': {'A': 1, 'C': 2, 'D': 5},
    'C': {'A': 4, 'B': 2, 'D': 1},
    'D': {'B': 5, 'C': 1}
}

'A' 为源点,运行 Dijkstra 算法后得到的 dist 结果为:

复制代码
{'A': 0, 'B': 1, 'C': 3, 'D': 4}
相关推荐
无敌最俊朗@14 小时前
力扣hot100-206反转链表
算法·leetcode·链表
Kuo-Teng14 小时前
LeetCode 279: Perfect Squares
java·数据结构·算法·leetcode·职场和发展
王哈哈^_^14 小时前
YOLO11实例分割训练任务——从构建数据集到训练的完整教程
人工智能·深度学习·算法·yolo·目标检测·机器学习·计算机视觉
檐下翻书17315 小时前
从入门到精通:流程图制作学习路径规划
论文阅读·人工智能·学习·算法·流程图·论文笔记
CoderYanger15 小时前
B.双指针——3194. 最小元素和最大元素的最小平均值
java·开发语言·数据结构·算法·leetcode·职场和发展·1024程序员节
小曹要微笑16 小时前
STM32各系列时钟树详解
c语言·stm32·单片机·嵌入式硬件·算法
前进的李工17 小时前
LeetCode hot100:094 二叉树的中序遍历:从递归到迭代的完整指南
python·算法·leetcode·链表·二叉树
麦麦大数据18 小时前
F049 知识图谱双算法推荐在线学习系统vue+flask+neo4j之BS架构开题论文全源码
学习·算法·知识图谱·推荐算法·开题报告·学习系统·计算机毕业设计展示
兩尛18 小时前
215. 数组中的第K个最大元素
数据结构·算法·排序算法
9523618 小时前
数据结构-堆
java·数据结构·学习·算法