深度优先搜索(DFS)邻接矩阵实现

代码:

cs 复制代码
// 访问标记数组,需要提前初始化为false
bool visited[MAX_VERTEX_NUM]; 

void DFS(AMGraph G, int v) {    // 图G为邻接矩阵类型,v是当前访问的顶点
    // 步骤1:访问顶点v
    cout << v;                  // 输出顶点编号
    visited[v] = true;          // 标记顶点v为已访问
    
    // 步骤2:检查v的所有邻接点
    for(int w = 0; w < G.vexnum; w++) {  // vexnum是顶点总数
        // 步骤3:判断w是否是v的未访问邻接点
        if((G.arcs[v][w] != 0) && (!visited[w])) {
            // 步骤4:递归访问邻接点w
            DFS(G, w);
        }
    }
    // 步骤5:当前顶点v的所有邻接点处理完成
}

超详细执行步骤解析

假设我们有如下无向图的邻接矩阵表示(顶点0,1,2,3):

复制代码
  0 1 2 3
0 0 1 0 1
1 1 0 1 1
2 0 1 0 1
3 1 1 1 0

初始状态

  • visited数组初始化为[false, false, false, false]

  • 假设从顶点0开始遍历:DFS(G, 0)

调用DFS(G, 0)

  1. 访问顶点0

    • 输出:0

    • visited变为:[true, false, false, false]

  2. 检查顶点0的邻接点(w从0到3)

    • w=0:

      • G.arcs[0][0] = 0(对角线元素,跳过)
    • w=1:

      • G.arcs[0][1] = 1且visited[1]=false

      • 递归调用DFS(G, 1)

调用DFS(G, 1)

  1. 访问顶点1

    • 输出:0 1

    • visited变为:[true, true, false, false]

  2. 检查顶点1的邻接点

    • w=0:

      • G.arcs[1][0] = 1但visited[0]=true(已访问过)
    • w=1:

      • G.arcs[1][1] = 0(跳过)
    • w=2:

      • G.arcs[1][2] = 1且visited[2]=false

      • 递归调用DFS(G, 2)

调用DFS(G, 2)

  1. 访问顶点2

    • 输出:0 1 2

    • visited变为:[true, true, true, false]

  2. 检查顶点2的邻接点

    • w=0:

      • G.arcs[2][0] = 0(跳过)
    • w=1:

      • G.arcs[2][1] = 1但visited[1]=true
    • w=2:

      • G.arcs[2][2] = 0(跳过)
    • w=3:

      • G.arcs[2][3] = 1且visited[3]=false

      • 递归调用DFS(G, 3)

调用DFS(G, 3)

  1. 访问顶点3

    • 输出:0 1 2 3

    • visited变为:[true, true, true, true]

  2. 检查顶点3的邻接点

    • w=0:

      • G.arcs[3][0] = 1但visited[0]=true
    • w=1:

      • G.arcs[3][1] = 1但visited[1]=true
    • w=2:

      • G.arcs[3][2] = 1但visited[2]=true
    • w=3:

      • G.arcs[3][3] = 0(跳过)
    • 递归结束,返回到DFS(G,2)

返回到DFS(G,2)

  • 顶点2的所有邻接点已处理完毕

  • 递归结束,返回到DFS(G,1)

返回到DFS(G,1)

  • 继续检查w=3:

    • G.arcs[1][3] = 1但visited[3]=true(已访问过)
  • 顶点1的所有邻接点已处理完毕

  • 递归结束,返回到DFS(G,0)

返回到DFS(G,0)

  • 继续检查w=3:

    • G.arcs[0][3] = 1但visited[3]=true(已访问过)
  • 顶点0的所有邻接点已处理完毕

  • 递归结束,整个DFS完成

最终遍历结果

输出序列:0 1 2 3

一些理解:

相关推荐
Logic1011 小时前
C语言/数据结构排序题解:三个数的最大乘积——排序后比较两种候选情况
c语言·数据结构·数组·排序·时间复杂度·算法题·负数处理
朝朝辞暮i2 小时前
C++ 第 31C 课:Subscriber 到底是什么
开发语言·c++·算法
殷色玫瑰2 小时前
C++ string类详解:常用接口、字符串操作与模拟实现
java·linux·c语言·开发语言·数据结构·c++
Evand J2 小时前
【MATLAB例程】三维RRT+APF路径规划与AOA-TDOA融合定位算法。附代码的下载链接
算法·matlab·路径规划·rrt·tdoa·apf·aoa
海绵宝宝转agent3 小时前
leetCode100算法开源笔记分享
笔记·算法
写后端的胖头鱼3 小时前
时间复杂度 & 空间复杂度
java·数据结构·算法·时间复杂度·空间复杂度
多弗朗皮卡丘3 小时前
数据结构番外:环形队列
数据结构·c
hahaha60163 小时前
黑体轨迹和色温--光源白点
人工智能·嵌入式硬件·算法·计算机视觉
海绵宝宝转agent3 小时前
基于Redis ZSet+AOP+注解实现限流注解算法
数据库·redis·算法
50万马克的面包4 小时前
顺序表和链表_精华知识点_CSDN博客
数据结构·链表