当前位置: 首页 > backend >正文

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

代码:

// 访问标记数组,需要提前初始化为false
bool visited[MAX_VERTEX_NUM]; void DFS(AMGraph G, int v) {    // 图G为邻接矩阵类型,v是当前访问的顶点// 步骤1:访问顶点vcout << 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:递归访问邻接点wDFS(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] = 1visited[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] = 1visited[0]=true(已访问过)

    • w=1:

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

    • w=2:

      • G.arcs[1][2] = 1visited[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] = 1visited[1]=true

    • w=2:

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

    • w=3:

      • G.arcs[2][3] = 1visited[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] = 1visited[0]=true

    • w=1:

      • G.arcs[3][1] = 1visited[1]=true

    • w=2:

      • G.arcs[3][2] = 1visited[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] = 1visited[3]=true(已访问过)

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

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

返回到DFS(G,0)

  • 继续检查w=3:

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

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

  • 递归结束,整个DFS完成

最终遍历结果

输出序列:0 1 2 3

一些理解:

http://www.xdnf.cn/news/10458.html

相关文章:

  • 计算机网络 TCP篇常见面试题总结
  • ps填充图层
  • Adobe LiveCycle ES、LiveCycle DS 与 BlazeDS 关系解析与比较
  • c++ QicsTable使用实例
  • linux信号详解
  • 人工智能100问☞第38问:什么是多模态模型?
  • 【课堂笔记】生成对抗网络 Generative Adversarial Network(GAN)
  • 任务23:创建天气信息大屏Django项目
  • 【BootLoader】之stm32F407实现bootloader相关问题
  • Python+MongoDb使用手册(精简)
  • python打卡day42
  • 学习日记-day20-6.1
  • 【AI论文】推理语言模型的强化学习熵机制
  • Cocos 打包 APK 兼容环境表(Android API Level 10~15)
  • 从线性代数到线性回归——机器学习视角
  • 获取 HTTP 请求从发送到接收响应所花费的总时间
  • 什么是缺页中断(缺页中断详解)
  • 基于微信小程序的垃圾分类系统
  • 西瓜书第十章——聚类
  • 思科设备网络实验
  • 鸿蒙OSUniApp集成WebAssembly实现高性能计算:从入门到实践#三方框架 #Uniapp
  • 开发指南120-表格(el-table)斑马纹
  • 无法运用pytorch环境、改环境路径、隔离环境
  • Python编程基础(二)| 列表简介
  • 【Redis】笔记|第4节|Redis数据安全性分析
  • 数据类型与推断:TypeScript 的基础
  • wordpress免费主题网站
  • ASP.NET Core SignalR 身份认证集成指南(Identity + JWT)
  • Spring Boot,注解,@ConfigurationProperties
  • 手拆STL