迪杰斯特拉算法用数组实现的核心是dist[]存最短距离、visited[]标记是否已确定最短路径;初始化dist[src]=0、其余为max_value,visited全为false;每轮选未访问中dist最小的u,设visited[u]=true,并对其邻接点v松弛更新;共n轮,可加prev[]还原路径。

用数组实现迪杰斯特拉算法,核心是靠两个一维数组协同管理节点状态:一个存当前最短距离,一个标记是否已确定最短路径。不需要复杂数据结构,适合顶点数不多、图用邻接矩阵表示的场景。
距离数组 dist[] 的作用与初始化
dist[i] 表示从源点到顶点 i 的当前已知最短距离。
- 源点 src 对应位置设为 0:
dist[src] = 0 - 其余顶点初始设为不可达状态,Java 中常用
Integer.MAX_VALUE(C/C++ 用INT_MAX或自定义大常量) - 若图用邻接矩阵
graph[][]存储,则初始化可直接复制首行:dist[i] = graph[src][i](注意跳过无边情况,如 graph[src][i] == 0 或 MAX 值时需设为 MAX_VALUE)
访问标记数组 visited[] 的意义
visited[i] 是布尔标记,表示顶点 i 是否已进入“最短路径集合”——即它的最短距离已最终确认,后续不再更新。
- 全部初始化为
false - 每轮选出未访问中 dist 最小的顶点 u 后,立即执行
visited[u] = true - 松弛操作时只处理
!visited[v]的邻接点,避免重复或错误覆盖
主循环中的关键操作:选点 + 松弛
共执行 n 轮(n 为顶点总数),每轮完成一次“确定最短距离”的节点扩张。
- 线性扫描找最小:遍历所有 i,满足
!visited[i] && dist[i] ,记录下标 u - 若 u == -1,说明剩余节点均不可达,可提前退出
- 对每个邻接点 v(即
graph[u][v] > 0或graph[u][v] != MAX),检查能否通过 u 改进 dist[v]:
if (dist[u] + graph[u][v]
补充:如何还原实际路径(不止距离)
仅靠 dist[] 只能得到最短距离值。若需输出路径,需额外维护前驱数组 prev[]:
- 初始化
prev[i] = -1 - 每次成功更新
dist[v]时,同步设置prev[v] = u - 从终点反向追踪
prev[dest], prev[prev[dest]], ...直到源点,再逆序即可得完整路径










