如何使用Java函数进行BFS(广度优先搜索)
发布时间:2023-05-28 11:21:56
广度优先搜索(BFS)是一个用于图形搜索和遍历的算法,它从给定的起点开始,完成对整个图的遍历,并找到目标节点。BFS 用简单的队列数据结构来完成整个搜索过程,起始节点先入队,然后出队,进而扩展出所有相邻节点,将相邻节点加入队列,直到找到目标节点或者遍历完整张图。以下是使用 Java 函数进行 BFS 的步骤:
1. 创建一个 Queue 数据结构,在Java 库中可以使用 LinkedList 实现它:
Queue<Integer> queue = new LinkedList<>();
2. 创建一个 HashSet 数据结构来存储已访问的节点:
HashSet<Integer> visited = new HashSet<>();
3. 初始化起始节点,并将其添加到队列 queue 中,同时标记已访问:
int start = 0; queue.add(start); visited.add(start);
4. 在 while 循环中,每次在队列 queue 中出队首个节点,并处理该节点的所有相邻节点:
while(!queue.isEmpty()) {
int cur = queue.poll(); // 出队首个节点
for(int neighbor : getNeighbors(cur)) { // 处理所有相邻节点
if(!visited.contains(neighbor)) { // 如果相邻节点未访问过,标记已访问并加入队列
visited.add(neighbor);
queue.add(neighbor);
}
}
}
5. 在找到目标节点时结束循环,返回结果:
if(cur == target) {
// 找到了目标节点
return target;
}
6. 如果整个图遍历结束后仍未找到目标节点,则说明目标节点不存在于此图中:
// 图中不存在目标节点 return -1;
完整的 Java 代码示例:
import java.util.*;
public class BFS {
public static int bfs(int[][] graph, int start, int target) {
Queue<Integer> queue = new LinkedList<>(); // 创建队列 Queue
HashSet<Integer> visited = new HashSet<>(); // 创建 visited 集合
queue.add(start); // 添加起始节点
visited.add(start); // 标记已访问
while(!queue.isEmpty()) { // 循环处理队列中所有节点
int cur = queue.poll(); // 出队首节点
if(cur == target) { // 找到目标节点
return target;
}
for(int neighbor : graph[cur]) { // 处理相邻节点
if(!visited.contains(neighbor)) { // 如果相邻节点未访问过,加入队列并标记已访问
visited.add(neighbor);
queue.add(neighbor);
}
}
}
return -1; // 图中不存在目标节点
}
public static void main(String[] args) {
// 图的邻接表表示
int[][] graph = new int[][] {
{1, 2},
{0, 2, 3},
{0, 1, 3},
{1, 2}
};
int start = 0; // 起始节点
int target = 3; // 目标节点
int res = bfs(graph, start, target); // 调用 BFS 算法
System.out.println(res); // 输出结果
}
}
以上是使用 Java 函数进行 BFS 的步骤和代码示例,通过以上简单的示例程序,您可以轻松实现 BFS 算法,并找到任何所需的目标节点。
