bfs天然适合求解无权图最短路径,因其按层扩展,首次到达目标节点时的步数即为最短距离;需用队列维护顺序、入队时标记visited、记录距离或前驱以支持路径还原。

在 Java 算法求解中,BFS 天然适合找无权图(或所有边权为 1)的最短路径,因为它按层扩展,第一次到达目标节点时走过的步数就是最短距离。
用队列维护访问顺序,记录步数或距离
BFS 的核心是队列(Queue),通常用 LinkedList 或 ArrayDeque 实现。每入队一个节点,同时记录它到起点的距离(或步数)。常见做法是封装成内部类或使用二维数组/哈希表存距离:
- 定义
class Node { int x, y, steps; }(网格场景)或class State { int id; int dist; }(图节点) - 初始化起点
steps = 0入队;每次出队后,对所有未访问邻接点设置dist = cur.dist + 1并入队 - 一旦弹出目标节点,立即返回其
steps—— 此时必为最小值
必须配合 visited 数组/集合避免重复入队
无向图或有环图中,不标记已访问会导致死循环或冗余计算。注意:不能只靠队列判重(队列允许重复?不,但没标记就会反复加入)。
- 用布尔数组
boolean[] visited(节点编号连续时)或Set<integer></integer>/Set<string></string>(坐标或复合状态) - 关键细节:标记时机必须是入队时,不是出队时——否则同一节点可能被多次加入队列
- 例如网格中,(x,y) 第一次加入队列就设
visited[x][y] = true,后续遇到直接跳过
适用于多种结构:二维网格、邻接表图、隐式图
BFS 不限于标准图结构,只要能定义“当前状态”和“合法下一步”,就能建模:
- 二维网格(如迷宫):四个方向移动,检查边界和障碍物
-
邻接表图(
List<list>> graph</list>):遍历graph.get(cur)中每个 neighbor - 隐式图(如单词接龙、数字变换):通过规则生成下一状态(如改变一位字符、±1/×2 等),再过滤合法状态
想返回具体路径?额外记录前驱节点
仅求长度只需计数;若需输出路径,得保存每个节点的前一个节点(parent)。
- 用
int[] parent(编号连续)或Map<state state></state>记录谁走到当前节点 - 到达终点后,从终点不断回溯
parent[dst],最后反转列表即最短路径 - 网格中常用
int[][] prev存前驱坐标,或封装Node时加Node prev字段
不复杂但容易忽略细节:入队即标记、队列存状态+步数、邻接点生成要合法。写熟模板后,换输入形式只需改邻居生成逻辑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











