深度优先搜索(DFS)算法遍历图

复制代码
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);
    }
}
  1. GraphDFS 类定义了一个图,使用邻接表来表示图的结构。它有一个构造函数 GraphDFS(int v),用于初始化图,其中 v 是图中节点的数量。
  2. addEdge(int v, int w) 方法用于向图中添加边,将节点 v 和节点 w 之间建立连接。
  3. DFS(int v) 方法是对外公开的深度优先搜索接口,它接受一个起始节点 v 并启动深度优先搜索。
  4. DFSUtil(int v, boolean[] visited) 方法是内部实现深度优先搜索的递归函数。它接受一个节点 v 和一个布尔类型的数组 visited,用于记录节点是否已经被访问过。在该方法中,首先标记当前节点 v 为已访问,然后递归地遍历当前节点的邻居节点,对未访问过的邻居节点再次调用 DFSUtil 方法。
  5. 在 main 方法中,创建了一个图实例 graph,并添加了一些边。然后调用 DFS(2) 方法,从节点 2 开始进行深度优先搜索。
  6. 最后,打印了深度优先遍历的结果。

该代码创建了一个图,其节点数为 4,边的连接关系如下:

  • 节点 0 与节点 1、2 相连
  • 节点 1 与节点 2 相连
  • 节点 2 与节点 0、3 相连
  • 节点 3 与节点 3 相连
相关推荐
非优秀程序员3 小时前
第04章 邮箱大战,163 与 QQ 的暗战|《互联网产品恩仇录》
java·vue.js·架构
知已难寻4 小时前
Docker 入门:容器技术与 Docker 基础
java·运维·服务器·docker·云原生·容器
文丑颜不良啊6 小时前
LeetCode2481~2500题目解析
java·leetcode
Flynn Liang7 小时前
同一需求三套写法:用 Spring AI、LangChain4j、AgentScope Java 各实现一个带工具调用的 RAG 助手(实战对比)
java·人工智能·大模型·架构设计·spring ai·langchain4j·agentscope
聪明的笨猪猪7 小时前
实际工程问题:AI 生成 Spring Cache(@Cacheable / @CachePut / @CacheEvict)缓存注解踩坑
java·经验分享·面试·ai编程
愿有所息8 小时前
记一次 ARM64 + JDK8 上 fastjson2 的诡异数据错乱
java
秋饼8 小时前
MCP 2026-07-28 无状态协议大改版:Spring AI 2.1 多轮往返请求与网关路由落地
java·ai·技术分享·后端开发
SL_staff9 小时前
JVS-BI 实战:业务人员如何用零代码 ELT + 可视化配置构建实时经营分析闭环
java·spring·全栈
SL_staff10 小时前
企业AI落地难?JVS-AI渐进式实践:安全可控、小切口验证、标准化沉淀与规模化复制
java·开源·aigc
SL_staff11 小时前
JVS数字底座实践:构建企业级统一内容管理平台的技术路径
java·产品