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

深度优先搜索(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

一些理解:

相关文章:

  • Vue单文件组件
  • Redis分布式锁深度解析与最佳实践
  • [Python] Python中的多重继承
  • 用Python打开不同联类型的文件
  • 深入理解享元模式:用Java实现高效对象共享
  • Python中scapy库详细使用(强大的交互式数据包操作程序和库)
  • 思科设备网络实验
  • Python数据类型详解:从字符串到布尔值,一网打尽
  • 《机器学习数学基础》补充资料:韩信点兵与拉格朗日插值法
  • sqli-labs靶场32-37关(宽字节注入)
  • hot100 -- 5.普通数组系列
  • 机器学习算法-k-means
  • 02.上帝之心算法用GPU计算提速50倍
  • python库 PyYAML 详细使用
  • 【算法题】算法一本通
  • android stdio 的布局属性
  • 《Python语言程序设计》2018 第4章第9题3重量和价钱的对比,利用第7章的概念来解答你
  • 初学c语言22(编译和链接)
  • Day09
  • day62—DFS—太平洋大西洋水流问题(LeetCode-417)
  • 网站建设单位/德兴网站seo
  • 云南旅游网站建设公司/经典软文案例或软文案例
  • 企业自适应网站建设/google adsense
  • 安徽省交通运输厅秦勤/北京网站优化外包
  • 网站更改关键词/企业网站seo托管怎么做
  • 政府网站源码下载/友情链接有什么用