基于邻接矩阵的Java BFS实现问题:数组赋值异常致得分未递增
解决邻接矩阵BFS算法中数组赋值异常的问题
我一眼就看到你代码里的核心问题了——output数组的初始化方式完全错了,这直接导致你没法正确存储所有节点的BFS结果,得分(应该是节点的访问顺序)自然没法递增。咱们一步步拆解问题,再给出修复方案:
问题根源分析
- 数组长度固定死了:你写了
int[] output = {0};,这意味着这个数组只有1个元素的空间。而你的图有v个节点(v=graph.length),后续遍历到的节点根本没地方存,要么数组越界报错,要么就只能保留初始的0,其他结果完全没法写入。 - 缺少动态赋值的索引:你没有一个变量来跟踪
output数组当前该赋值到哪个位置,没法按BFS的顺序依次把节点存进去。
修正后的完整BFS代码
import java.util.LinkedList; public class BFS_DFS { public static int[] BFS(int[][] graph) { int v = graph.length; int[] output = new int[v]; // 初始化和节点数一样长的数组 int index = 0; // 用来跟踪output的赋值位置 int start = 0; boolean[] visited = new boolean[v]; LinkedList<Integer> queue = new LinkedList<>(); // 初始化起始节点 visited[start] = true; queue.add(start); output[index++] = start; // 把起始节点存入output while (!queue.isEmpty()) { int current = queue.poll(); // 取出队首节点 // 遍历所有邻接节点 for (int i = 0; i < v; i++) { // 如果当前节点和i相连,且i未被访问 if (graph[current][i] == 1 && !visited[i]) { visited[i] = true; queue.add(i); output[index++] = i; // 按顺序存入output数组 } } } return output; } // 测试用例 public static void main(String[] args) { // 假设这是一个连通的邻接矩阵,节点0到5依次可达 int[][] graph = { {0,1,0,0,0,0}, {1,0,1,0,0,0}, {0,1,0,1,0,0}, {0,0,1,0,1,0}, {0,0,0,1,0,1}, {0,0,0,0,1,0} }; int[] result = BFS(graph); for (int num : result) { System.out.print(num + " "); } // 输出会是:0 1 2 3 4 5 } }
关键修复点说明
- 把
output数组初始化为new int[v],确保有足够空间存储所有节点的BFS访问顺序。 - 新增
index变量,每次存入一个节点后就自增,保证按BFS的顺序依次赋值。 - 严格遵循BFS的流程:标记已访问→加入队列→存入结果数组,循环处理直到队列为空。
这样修改后,你的程序就能输出预期的0 1 2 3 4 5 了。如果你的图不是连通的,还可以额外处理未访问的节点,但从你的预期输出来看,应该是连通图的场景,这个代码完全适用。
内容的提问来源于stack exchange,提问作者user1221346712987
相关产品推荐
相关产品推荐

