如何在 Java 中利用数组实现简单的迪杰斯特拉(Dijkstra)算法中的距离状态表
聊到 Dijkstra 算法的数组实现,核心其实很简单:两个数组打天下——一个 dist[] 记录源点到各顶点的当前最短距离,另一个 visited[] 标记哪些顶点已经“板上钉钉”了。这种写法特别适合顶点数不多、图结构比较规矩(比如用邻接矩阵存)的场景,代码清晰,理解起来也不费力。 距离数组与访问
聊到 Dijkstra 算法的数组实现,核心其实很简单:两个数组打天下——一个 dist[] 记录源点到各顶点的当前最短距离,另一个 visited[] 标记哪些顶点已经“板上钉钉”了。这种写法特别适合顶点数不多、图结构比较规矩(比如用邻接矩阵存)的场景,代码清晰,理解起来也不费力。

距离数组与访问标记数组的定义
假设图有 n 个顶点(编号 0 到 n−1),源点为 src:
int[] dist = new int[n];—— 初始化时除了dist[src] = 0,其余统统设为Integer.MAX_VALUE,代表“暂时够不着”。boolean[] visited = new boolean[n];—— 标记每个顶点是否已经确定最终的最短距离。
初始化与主循环逻辑
初始化完事之后,就是经典的 n 轮迭代。每轮干三件事:
- 找最小:在所有没访问过的顶点里,挑一个
dist值最小的u。这里直接线性扫描就行,不用优先队列之类的花哨东西。 - 标记:把
visited[u]设为true,表示这个点的最短距离已经定下来了。 - 松弛:遍历
u的所有邻接点v,如果dist[u] + weight < dist[v],就更新dist[v]。
注意细节:如果你用的是邻接矩阵 graph[u][v],权值非负,用 0 或 Integer.MAX_VALUE 表示没有边;要是邻接表,就得额外遍历每个顶点的邻居列表。
关键细节与常见陷阱
用数组实现时,有几个容易翻车的地方值得多看一眼:
- 别让整数溢出坑了你:比较
dist[u] + weight < dist[v]之前,一定先判断dist[u] == Integer.MAX_VALUE。不然加出来的负数会让你一脸懵,直接导致错误更新。 - 负权边?想都别想:Dijkstra 天生不认负权边,数组实现也救不了,换个算法吧。
- 不可达就是不可达:最终
dist[i]如果还是Integer.MAX_VALUE,说明源点根本到不了i。
简化的代码片段示意
拿邻接矩阵举个例子(无边用 INF = Integer.MAX_VALUE 表示):
final int INF = Integer.MAX_VALUE;
int n = graph.length;
int[] dist = new int[n];
boolean[] visited = new boolean[n];
Arrays.fill(dist, INF);
dist[src] = 0;
for (int i = 0; i < n; i++) {
// 找当前未访问的最小距离顶点
int u = -1;
for (int j = 0; j < n; j++) {
if (!visited[j] && (u == -1 || dist[j] < dist[u])) u = j;
}
if (u == -1 || dist[u] == INF) break; // 剩余不可达,提前退出
visited[u] = true;
// 松弛所有邻接点
for (int v = 0; v < n; v++) {
if (graph[u][v] != INF && dist[u] != INF) { // 防溢出
int alt = dist[u] + graph[u][v];
if (alt < dist[v]) dist[v] = alt;
}
}
}
这个实现的时间复杂度是 O(V²),适合 V ≤ 1000 的稠密图。如果顶点多且图稀疏,建议改用堆优化版本(PriorityQueue),性能会好不少。
Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。
Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。
Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。
PixPix 是面向品牌、卖家和内容团队的在线 AI 图片视频创作平台,提供图视频 Agent、无限画布、图片生成、视频生成、自然语言编辑及商品套图、产品精修和带货视频等电商工具。
Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等
Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。













