广度优先搜索(BFS)是一种图搜索算法,用于在图或树数据结构中寻找特定节点或路径。它从起始节点开始,逐层遍历图中的节点,直到找到目标节点或遍历完整个图。
BFS解决的问题是在一个图中寻找最短路径或最少步骤来达到目标节点。它可以用于解决迷宫问题、网络路由问题、社交网络中的关系查找等。
这个代码创建了一个图,并使用LinkedList表示。然后,我们使用BFS算法来找到从起始节点到目标节点的最短路径。在main
方法中,我们创建了一个图并指定起始节点和目标节点。然后调用BFS
方法来执行搜索并打印最短路径。
- import java.util.*;
-
- public class BFSAlgorithm {
- private int V; // 图中节点的数量
- private LinkedList
[] adj; // 邻接表表示的图 -
- public BFSAlgorithm(int v) {
- V = v;
- adj = new LinkedList[v];
- for (int i = 0; i < v; ++i)
- adj[i] = new LinkedList();
- }
-
- // 添加边
- void addEdge(int v, int w) {
- adj[v].add(w);
- }
-
- // 使用BFS算法找到从起始节点到目标节点的最短路径
- void BFS(int start, int target) {
- boolean[] visited = new boolean[V]; // 用于标记节点是否被访问过
- int[] parent = new int[V]; // 用于记录每个节点的父节点
- Arrays.fill(parent, -1);
-
- LinkedList
queue = new LinkedList<>(); -
- visited[start] = true;
- queue.add(start);
-
- while (queue.size() != 0) {
- int current = queue.poll();
-
- // 找到目标节点,打印最短路径并返回
- if (current == target) {
- printPath(parent, target);
- return;
- }
-
- Iterator
iterator = adj[current].listIterator(); - while (iterator.hasNext()) {
- int next = iterator.next();
- if (!visited[next]) {
- visited[next] = true;
- parent[next] = current;
- queue.add(next);
- }
- }
- }
-
- // 如果无法找到目标节点,打印提示信息
- System.out.println("无法找到从起始节点到目标节点的路径");
- }
-
- // 打印最短路径
- void printPath(int[] parent, int target) {
- LinkedList
path = new LinkedList<>(); - int current = target;
- path.add(current);
-
- while (parent[current] != -1) {
- path.addFirst(parent[current]);
- current = parent[current];
- }
-
- System.out.println("最短路径为:" + path);
- }
-
- public static void main(String[] args) {
- BFSAlgorithm graph = new BFSAlgorithm(6);
-
- // 添加边
- graph.addEdge(0, 1);
- graph.addEdge(0, 2);
- graph.addEdge(1, 3);
- graph.addEdge(1, 4);
- graph.addEdge(2, 4);
- graph.addEdge(3, 5);
- graph.addEdge(4, 5);
-
- int start = 0; // 起始节点
- int target = 5; // 目标节点
-
- System.out.println("从节点 " + start + " 到节点 " + target + " 的最短路径为:");
- graph.BFS(start, target);
- }
- }