import java.util.*;
public class GraphDFS {
private int V; // 图中节点的数量
private List<List<Integer>> adj; // 邻接表表示的图
public GraphDFS(int v) {
V = v;
adj = new ArrayList<List<Integer>>(v);
for (int i = 0; i < v; ++i)
adj.add(new ArrayList<Integer>());
}
public void addEdge(int v, int w) {
adj.get(v).add(w);
}
public void DFS(int v) {
boolean[] visited = new boolean[V];
DFSUtil(v, visited);
}
private void DFSUtil(int v, boolean[] visited) {
visited[v] = true;
System.out.print(v + " ");
List<Integer> neighbors = adj.get(v);
for (int neighbor : neighbors) {
if (!visited[neighbor]) {
DFSUtil(neighbor, visited);
}
}
}
public static void main(String[] args) {
GraphDFS graph = new GraphDFS(4);
graph.addEdge(0, 1);
graph.addEdge(0, 2);
graph.addEdge(1, 2);
graph.addEdge(2, 0);
graph.addEdge(2, 3);
graph.addEdge(3, 3);
System.out.println("深度优先遍历结果:");
graph.DFS(2);
}
}
GraphDFS
类定义了一个图,使用邻接表来表示图的结构。它有一个构造函数GraphDFS(int v)
,用于初始化图,其中v
是图中节点的数量。addEdge(int v, int w)
方法用于向图中添加边,将节点v
和节点w
之间建立连接。DFS(int v)
方法是对外公开的深度优先搜索接口,它接受一个起始节点v
并启动深度优先搜索。DFSUtil(int v, boolean[] visited)
方法是内部实现深度优先搜索的递归函数。它接受一个节点v
和一个布尔类型的数组visited
,用于记录节点是否已经被访问过。在该方法中,首先标记当前节点v
为已访问,然后递归地遍历当前节点的邻居节点,对未访问过的邻居节点再次调用DFSUtil
方法。- 在
main
方法中,创建了一个图实例graph
,并添加了一些边。然后调用DFS(2)
方法,从节点 2 开始进行深度优先搜索。 - 最后,打印了深度优先遍历的结果。
该代码创建了一个图,其节点数为 4,边的连接关系如下:
- 节点 0 与节点 1、2 相连
- 节点 1 与节点 2 相连
- 节点 2 与节点 0、3 相连
- 节点 3 与节点 3 相连