深度优先遍历DFS:从入门到精通

一、先解答上次的思考题

无向图:顶点 0-1-2-3,边:0-1、0-2、1-2、2-3

  • 邻接矩阵:对应位置置 1
  • 邻接表:每个顶点链表列出邻居

二、今天学习目标

  1. 理解 DFS 深度优先遍历
  2. 记住核心思想:一条路走到黑,走不通再回头
  3. 邻接矩阵 + 递归实现 DFS
  4. 完整可运行代码

三、什么是 DFS?

DFS:Depth First Search深度优先,先走到底,再回溯

可以理解为:

  • 走迷宫:一直往前,遇到岔路选一条,走不通就退回来换一条
  • 树的前序遍历,就是 DFS 的一种

关键点:

  • 需要 visited 数组 标记是否走过
  • 一般用 递归 最简单

四、DFS 基本步骤

  1. 访问当前节点,标记 visited[u] = 1
  2. 遍历所有邻居 v
  3. 如果 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,写出遍历顺序。

相关推荐
文心快码BaiduComate3 小时前
2026 OPC x AI Coding 趋势案例交流会圆满落幕:一个人就一支研发团队
算法
ACM-moran3 小时前
条件显化(二分单峰函数+构造数列)
算法·推公式·整数三分
闻缺陷则喜何志丹4 小时前
【栈 运算系统】P3719 [AHOI2017初中组] rexp|普及+
c++·算法··洛谷·运算系统
疯狂打码的少年4 小时前
【数据库技术】多值依赖与第四范式(4NF)
数据库·笔记·算法
子文雨4 小时前
基于 uC3845 与 ATtiny13 双芯片架构的 8.4V/2.5Ah 锂电池智能充电器设计
单片机·嵌入式硬件·算法
青山木4 小时前
Hot 100 --- 数组中的第K个最大元素
java·数据结构·算法·排序算法
玛卡巴卡ldf4 小时前
【AICoding】笔试提示词设计思路
java·算法·ai编程
明月_清风5 小时前
位图与布隆过滤器:海量数据下的"存在性判断"艺术
前端·后端·算法
Rnan-prince5 小时前
堆与TopK · 从零到通透 —— 9 节全系列复盘
python·算法
明月_清风5 小时前
Hash 表从入门到精通:Go 实战与工程细节
前端·后端·算法