悠悠楠杉
<Java中的BFS算法:最短路径的正确姿势>
1. 数据结构的选择
- 邻接表:为了高效存储图的结构,选择邻接表作为数据结构。每个节点存储其相邻节点的列表,方便后续遍历。
- 队列:使用队列来实现广度优先搜索。队列的端点操作(如front()和back())用于取出节点,tail()用于添加节点。
2. 初始化
- 初始化一个队列,将起始节点加入队列。
- 初始化一个记录节点的 visited 数组,用于标记已访问的节点。
- 初始化一个结果数组,用于记录最短路径中的节点。
3. 队列处理
- 使用队列的front()操作取出起始节点。
- 对取出的节点进行处理:如果该节点未被访问过,则将其标记为已访问,并将所有相邻节点添加到队列中。
- 如果该节点已被访问过,则跳过处理。
4. 路径记录
- 在处理节点时,记录当前节点的父节点,以便后续路径的构建。
5. 循环与终止条件
- 重复上述步骤,直到队列为空。
- 如果队列为空时,检查目标节点是否被访问过。如果是,则返回最短路径;否则,返回无路径。
6. 代码实现
java
public class BFSAlgorithm {
public static void main(String[] args) {
// 初始化邻接表
List
adjList.add(new AdjacencyNode());
adjList.add(new AdjacencyNode());
adjList.add(new AdjacencyNode());
adjList.add(new AdjacencyNode());
adjList.add(new AdjacencyNode());
adjList.add(new AdjacencyNode());
adjList.add(new AdjacencyNode());
adjList.add(new AdjacencyNode());
adjList.add(new AdjacencyNode());
adjList.add(new AdjacencyNode());
adjList.add(new AdjacencyNode());
adjList.add(new AdjacencyNode());
// 初始化队列
Queue<AdjacencyNode> queue = new LinkedList<>();
queue.add(startNode);
visited.add(startNode);
result.add(startNode);
while (!queue.isEmpty()) {
AdjacencyNode u = queue.removeFirst();
for (AdjacencyNode v : adjList.get(u)) {
if (!visited.contains(v)) {
visited.add(v);
queue.add(v);
result.add(v);
// 添加处理下一个节点
queue.add(v);
}
}
}
// 检查目标节点是否被访问过
if (!visited.contains(targetNode)) {
System.out.println("无路径");
return;
}
// 构造路径
String path = new StringBuilder();
Node current = targetNode;
while (current != null) {
path.append(current);
current = result.get(current);
}
System.out.println("最短路径为:" + path.reverse());
}
}
代码示例:
java
package com.example.example;
import java.util.*;
class AdjacencyNode {
public int id;
public List
public AdjacencyNode(int id) {
this.id = id;
}
}
class BFSAlgorithm {
public static void main(String[] args) {
// 初始化邻接表
List
adjList.add(new AdjacencyNode(1));
adjList.add(new AdjacencyNode(2));
adjList.add(new AdjacencyNode(3));
adjList.add(new AdjacencyNode(4));
adjList.add(new AdjacencyNode(5));
// 初始化队列
Queue<AdjacencyNode> queue = new LinkedList<>();
queue.add(1);
visited.add(1);
result.add(1);
// BFS循环
while (!queue.isEmpty()) {
AdjacencyNode u = queue.removeFirst();
for (AdjacencyNode v : adjList.get(u)) {
if (!visited.contains(v)) {
visited.add(v);
queue.add(v);
result.add(v);
}
}
}
// 检查目标节点是否被访问过
if (!visited.contains(5)) {
System.out.println("无路径");
return;
}
// 构造路径
String path = new StringBuilder();
Node current = 5;
while (current != null) {
path.append(current);
current = result.get(current);
}
System.out.println("最短路径为:" + path.reverse());
}
}
总结:
Java中的BFS算法实现最短路径,需要选择邻接表作为数据结构,使用队列来遍历所有节点。代码实现需要维护队列和标记访问的节点,记录路径,最后检查目标节点是否被访问过。通过代码示例,可以清晰地看到BFS算法的实现细节,确保算法的正确性和高效性。
