dj算法思维导图
Dijkstra 算法(边权非负)
├─ 核心原则:进入堆修改候选距离,弹出堆结算最短距离
├─ 前置准备
│ ├─ 初始化距离数组 dist[]:源点 s 设为 0,其余为无穷大
│ ├─ 小根堆(优先级队列):存储 {当前候选距离, 节点编号}
│ └─ 辅助标记(按需):visited[](普通堆)/ where[](反向索引堆)
├─ 核心流程
│ ├─ 步骤1:入堆修改(候选距离优化)
│ │ ├─ 触发条件:遍历已结算节点 u 的邻边 u→v,发现 dist[u]+w < dist[v]
│ │ ├─ 普通堆实现:直接将 {新距离, v} 入堆(允许重复入堆)
│ │ └─ 反向索引堆实现:更新 dist[v],并调整 v 在堆中的位置(上浮)
│ ├─ 步骤2:出堆结算(确定最短距离)
│ │ ├─ 触发条件:弹出堆顶元素(当前候选距离最小的节点 u)
│ │ ├─ 普通堆实现:用 visited[u] 过滤重复,标记为 true 即完成结算
│ │ └─ 反向索引堆实现:用 where[u] = -2 标记已结算,无需额外数组
│ └─ 循环执行:直到堆为空
├─ 结果计算
│ ├─ 遍历 dist[]:取所有节点的最短距离的最大值
│ └─ 若存在节点距离为无穷大 → 不可达,返回 -1
└─ 两种堆实现对比
├─ 普通堆(邻接表+系统优先队列)
│ ├─ 入堆:允许多次入堆,产生冗余候选
│ ├─ 结算:依赖 visited 过滤重复节点
│ └─ 优点:代码简洁;缺点:效率略低
└─ 反向索引堆(链式前向星+手写堆)
├─ 入堆:同一节点仅存一份,直接更新距离并上浮
├─ 结算:弹出即标记,无冗余操作
└─ 优点:效率最优;缺点:代码稍复杂

浙公网安备 33010602011771号