BFS算法概述
BFS 算法实现(Java)
BFS(广度优先搜索)是一种图遍历算法,使用队列数据结构实现。以下是 Java 中 BFS 的两种常见实现方式:基于邻接表表示的图和基于矩阵表示的图。
邻接表表示的图的 BFS 实现
import java.util.*;class Graph {private int V; // 顶点数private LinkedList<Integer> adj[]; // 邻接表Graph(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);}void BFS(int s) {boolean visited[] = new boolean[V]; // 标记访问过的节点Queue<Integer> queue = new LinkedList<>();visited[s] = true;queue.add(s);while (!queue.isEmpty()) {s = queue.poll();System.out.print(s + " ");for (Integer n : adj[s]) {if (!visited[n]) {visited[n] = true;queue.add(n);}}}}
}public class Main {public static void main(String args[]) {Graph g = new Graph(4);g.addEdge(0, 1);g.addEdge(0, 2);g.addEdge(1, 2);g.addEdge(2, 0);g.addEdge(2, 3);g.addEdge(3, 3);System.out.println("BFS traversal (starting from vertex 2):");g.BFS(2);}
}
矩阵表示的图的 BFS 实现
import java.util.*;class Graph {private int V; // 顶点数private int adj[][]; // 邻接矩阵Graph(int v) {V = v;adj = new int[v][v];}void addEdge(int v, int w) {adj[v][w] = 1;}void BFS(int s) {boolean visited[] = new boolean[V];Queue<Integer> queue = new LinkedList<>();visited[s] = true;queue.add(s);while (!queue.isEmpty()) {s = queue.poll();System.out.print(s + " ");for (int i = 0; i < V; i++) {if (adj[s][i] == 1 && !visited[i]) {visited[i] = true;queue.add(i);}}}}
}public class Main {public static void main(String args[]) {Graph g = new Graph(4);g.addEdge(0, 1);g.addEdge(0, 2);g.addEdge(1, 2);g.addEdge(2, 0);g.addEdge(2, 3);g.addEdge(3, 3);System.out.println("BFS traversal (starting from vertex 2):");g.BFS(2);}
}
关键点说明
- 队列的使用:BFS 使用队列来存储待访问的节点,确保按照层级顺序遍历。
- 访问标记:使用布尔数组标记已访问的节点,避免重复访问。
- 时间复杂度:对于邻接表表示,时间复杂度为 O(V + E);对于邻接矩阵表示,时间复杂度为 O(V²),其中 V 是顶点数,E 是边数。
这两种实现方式适用于不同的图表示方法,邻接表更适合稀疏图,邻接矩阵更适合稠密图。