Java中用二维数组实现邻接矩阵存储图,通过递归DFS遍历:构造函数初始化intn矩阵,addEdge添加边(无向图对称赋值),boolean[] visited标记状态,dfs方法先标记当前顶点再递归访问未访问的邻接点。

用Java实现图的邻接矩阵存储并执行深度优先搜索(DFS),核心在于:用二维数组表示顶点间连接关系,再通过递归或栈模拟访问过程,确保每个顶点只访问一次。
定义邻接矩阵结构
邻接矩阵本质是一个 n × n 的布尔型或整型二维数组(int[][] matrix),其中 matrix[i][j] == 1 表示存在从顶点 i 到 j 的边(无向图需同时设 matrix[j][i] = 1)。顶点用 0 到 n−1 的整数编号更便于索引。
建议做法:
- 构造函数中传入顶点数
n,初始化matrix = new int[n][n] - 提供
addEdge(int u, int v)方法添加边;无向图内自动补对称项 - 可选:用
boolean[] visited单独管理访问状态,比在矩阵中复用标记更清晰
实现递归版DFS遍历
从起始顶点出发,标记为已访问,然后遍历其所有邻接顶点——对每个未访问的邻接顶点,递归调用DFS。
立即学习“Java免费学习笔记(深入)”;
关键细节:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 递归前必须先设
visited[v] = true,避免重复入栈或死循环 - 遍历邻居时,检查
matrix[u][v] == 1 && !visited[v] - 可把访问顺序存入
List<integer></integer>或直接打印,便于验证结果
示例片段:
void dfs(int v, boolean[] visited, Listvisited[v] = true;
order.add(v);
for (int i = 0; i if (matrix[v][i] == 1 && !visited[i]) {
dfs(i, visited, order);
}
}
}
用栈实现非递归DFS(更贴近手动过程)
递归本质是系统栈,显式使用 Stack<integer></integer> 可避免栈溢出风险,也更易调试。
操作步骤:
- 将起点压栈,并标记
visited[start] = true - 循环直到栈空:弹出一个顶点
v,记录访问顺序;遍历所有i满足matrix[v][i]==1且未访问,依次压栈并标记 - 注意:为使输出顺序与递归版一致,应从**最高编号向最低编号**遍历邻居(因栈是后进先出)
完整调用与测试建议
写一个简单测试:构建含4个顶点的无向图(如 0−1, 1−2, 2−3),从顶点0开始DFS。预期访问序列为 0→1→2→3(或 0→1→2→3,取决于邻接顺序)。
提醒:
- 邻接矩阵适合顶点数不多(如 ≤1000)、边较稠密的图;稀疏图推荐邻接表
- 若图不连通,需在外层遍历所有未访问顶点,多次调用DFS,以获取全部连通分量
- 可扩展支持带权图:把
int[][] matrix中的 1 换成权重值,0 或 −1 表示无边

















