广度优先搜索(Breadth-First Search, BFS)是一种图搜索算法,通常用于遍历或搜索树或图的数据结构。它从一个起始节点开始,首先访问所有相邻的节点,然后再从这些相邻节点出发,访问它们的未访问过的相邻节点,依此类推,直到找到目标节点或遍历完所有可达节点。
以下是一个简单的 Java 实现,用于在无向图中进行广度优先搜索。假设图是用邻接表表示的:
import java.util.*;
class Graph {
private int numVertices; // 顶点数量
private LinkedList<Integer>[] adjLists; // 邻接表
// 构造函数
Graph(int vertices) {
numVertices = vertices;
adjLists = new LinkedList[vertices];
for (int i = 0; i < vertices; i++) {
adjLists[i] = new LinkedList<>();
}
}
// 添加边
void addEdge(int src, int dest) {
adjLists[src].add(dest);
adjLists[dest].add(src); // 因为是无向图,所以需要双向添加
}
// 广度优先搜索
void BFS(int startVertex) {
boolean[] visited = new boolean[numVertices]; // 记录节点是否被访问
LinkedList<Integer> queue = new LinkedList<>(); // 队列用于BFS
visited[startVertex] = true;
queue.add(startVertex);
while (!queue.isEmpty()) {
int vertex = queue.poll();
System.out.print(vertex + " ");
// 访问所有相邻节点
Iterator<Integer> it = adjLists[vertex].listIterator();
while (it.hasNext()) {
int adjVertex = it.next();
if (!visited[adjVertex]) {
visited[adjVertex] = true;
queue.add(adjVertex);
}
}
}
}
public static void main(String[] args) {
Graph graph = new Graph(5);
graph.addEdge(0, 1);
graph.addEdge(0, 2);
graph.addEdge(1, 3);
graph.addEdge(1, 4);
System.out.println("广度优先搜索(从顶点 0 开始):");
graph.BFS(0);
}
}
代码解释
- Graph 类:
numVertices
:存储图的顶点数量。adjLists
:一个邻接表数组,每个元素是一个LinkedList<Integer>
,用于存储与该顶点相邻的顶点。
- 构造函数:
- 初始化
numVertices
。 - 初始化
adjLists
,为每个顶点创建一个空的LinkedList
。
- 初始化
- addEdge 方法:
- 在无向图中,添加一条从
src
到dest
的边,需要在adjLists[src]
中添加dest
,并在adjLists[dest]
中添加src
。
- 在无向图中,添加一条从
- BFS 方法:
- 使用一个布尔数组
visited
记录每个顶点是否被访问过。 - 使用一个
LinkedList
作为队列,用于存储当前层的节点。 - 将起始顶点标记为已访问,并将其加入队列。
- 当队列不为空时,循环执行以下操作:
- 从队列中取出一个顶点,并打印。
- 访问该顶点的所有相邻顶点,如果相邻顶点未被访问过,则将其标记为已访问并加入队列。
- 使用一个布尔数组
- main 方法:
- 创建一个图并添加一些边。
- 调用
BFS
方法从顶点 0 开始进行广度优先搜索,并打印结果。
输出
广度优先搜索(从顶点 0 开始):
0 1 2 3 4
这个输出表示从顶点 0 开始,按照广度优先的顺序访问了所有顶点。