一、先解答上次的思考题
无向图:顶点 0-1-2-3,边:0-1、0-2、1-2、2-3
- 邻接矩阵:对应位置置 1
- 邻接表:每个顶点链表列出邻居
二、今天学习目标
- 理解 DFS 深度优先遍历
- 记住核心思想:一条路走到黑,走不通再回头
- 用邻接矩阵 + 递归实现 DFS
- 完整可运行代码
三、什么是 DFS?
DFS:Depth First Search深度优先,先走到底,再回溯
可以理解为:
- 走迷宫:一直往前,遇到岔路选一条,走不通就退回来换一条
- 树的前序遍历,就是 DFS 的一种
关键点:
- 需要 visited 数组 标记是否走过
- 一般用 递归 最简单
四、DFS 基本步骤
- 访问当前节点,标记
visited[u] = 1 - 遍历所有邻居
v - 如果
v没被访问,递归 DFS (v)
五、完整代码:邻接矩阵 + DFS
cpp
#include <stdio.h>
#define N 5
// 邻接矩阵
int graph[N][N] = {0};
// 访问标记
int visited[N] = {0};
// 添加无向边
void addEdge(int u, int v) {
graph[u][v] = 1;
graph[v][u] = 1;
}
// DFS 核心
void dfs(int u) {
// 访问当前节点
printf("%d ", u);
visited[u] = 1;
// 遍历所有可能邻居
for (int v = 0; v < N; v++) {
// 有边且未访问
if (graph[u][v] == 1 && !visited[v]) {
dfs(v);
}
}
}
int main() {
// 构建图
addEdge(0, 1);
addEdge(0, 2);
addEdge(1, 3);
addEdge(1, 4);
addEdge(3, 4);
printf("DFS 遍历顺序:");
dfs(0);
return 0;
}
六、运行结果示例
cpp
DFS 遍历顺序:0 1 3 4 2
(具体顺序可能因邻接矩阵遍历顺序略有不同,均属正确)
七、DFS 适用场景
- 连通性判断
- 迷宫求解
- 寻找路径
- 拓扑排序
- 求连通块数量
八、今日小练习
图:顶点:0 1 2 3边:0-1,0-2,1-2,2-3
从 0 开始 DFS,写出遍历顺序。