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

article/2025/8/7 7:50:24

代码:

// 访问标记数组,需要提前初始化为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.hkcw.cn/article/HoYRvZEIDa.shtml

相关文章

将手机网络经USB数据线和本地局域网共享给华为AP6050DN无线接入点

引言 由于最近装毕的新家所在的小区未能及时通宽带,于是家中各类无线设备如何上网就成了首要要解决的问题。 鉴于家中要联网的设备多、类型杂、支持频段也不一,总是开手机热点不是回事儿,于是就想着把手机网络引至华为AP6050DN无线接入点中,让家中所有的无线设备都能快速高…

接口安全SOAPOpenAPIRESTful分类特征导入项目联动检测

1 、 API 分类特征 SOAP - WSDL OpenApi - Swagger RESTful - /v1/api/ 2 、 API 常见漏洞 OWASP API Security TOP 10 2023 3 、 API 检测流程 接口发现&#xff0c;遵循分类&#xff0c;依赖语言&#xff0c; V1/V2 多版本等 Method &#xff1a;请求方法 攻击方…

Python基础:常量、变量、变量类型、表达式、注释、输入输入、运算符

引言 手把手带你快速上手Python 一、常量和表达式 在Python中运行下面的代码&#xff1a; print(1 2 - 3) print(1 2 * 3) print(1 2 / 3)​​​​ 注意: print 是一个 Python 内置的 函数, 这个稍后详细介绍.可以使用 - * / ( ) 等运算符进行算术运算. 先算乘除, 后算加…

归一化相关

归一化相关问题 归一化方式Batch NormalizationLayer NormalizationInstance NormalizationGroup NormalizationRMSNorm(Root Mean Square Layer Normalization):RMSNorm 和 LayerNorm区别?归一化方式 Batch Normalization 在每一层的输入进行归一化处理,使其在每个批次内…

进阶日记(一)—LLMs本地部署与运行(更新中)

本项目资料主要来源&#xff1a;【知识科普】【纯本地化搭建】【不本地也行】DeepSeek RAGFlow 构建个人知识库_哔哩哔哩_bilibili 目录 一、背景知识 二、Ollma安装 三、Docker安装 接上一篇&#xff08;非科班大模型工程师进阶日记&#xff08;〇&#xff09;&#xff…

【论文解读】Deformable DETR | Deformable Transformers for End-to-End Object Detection

论文地址&#xff1a;https://arxiv.org/pdf/2010.04159 代码地址&#xff1a;https://github.com/fundamentalvision/Deformable-DETR 摘要 DETR最近被提出&#xff0c;旨在消除物体检测中许多手工设计的组件的需求&#xff0c;同时展示出良好的性能。然而&#xff0c;由于T…

大语言模型的推理能力

2025年&#xff0c;各种会推理的AI模型如雨后春笋般涌现&#xff0c;比如ChatGPT o1/o3/o4、DeepSeek r1、Gemini 2 Flash Thinking、Claude 3.7 Sonnet (Extended Thinking)。 对于工程上一些问题比如复杂的自然语言转sql&#xff0c;我们可能忍受模型的得到正确答案需要更多…

PINN for PDE(偏微分方程)1 - 正向问题

PINN for PDE(偏微分方程)1 - 正向问题 目录 PINN for PDE(偏微分方程)1 - 正向问题一、什么是PINN的正问题二、求解的实际例子三、基于Pytorch实现的代码 - 分解3.1 引入库函数3.2 设置超参数3.3 设计随机种子&#xff0c;确保复现结果的一致性3.4 对于条件等式生成对应的训练…

Adobe LiveCycle ES、LiveCycle DS 与 BlazeDS 关系解析与比较

Adobe LiveCycle 系列产品是企业级解决方案的重要组成部分&#xff0c;但在命名和功能上常常造成混淆。 产品定义 Adobe LiveCycle ES (Enterprise Suite) LiveCycle ES是一个基于SOA的平台&#xff0c;部署在J2EE应用服务器上。它提供开发、部署、配置和执行服务的功能。基…

Redis最佳实践——性能优化技巧之监控与告警详解

Redis 在电商应用的性能优化技巧之监控与告警全面详解 一、监控体系构建 1. 核心监控指标矩阵 指标类别关键指标计算方式/说明健康阈值&#xff08;参考值&#xff09;内存相关used_memoryINFO Memory 获取不超过 maxmemory 的 80%mem_fragmentation_ratio内存碎片率 used_m…

使用 DeepSeek API 搭建智能体《无间》- 卓伊凡的完整指南 -优雅草卓伊凡

使用 DeepSeek API 搭建智能体《无间》- 卓伊凡的完整指南 -优雅草卓伊凡 作者&#xff1a;卓伊凡 前言&#xff1a;为什么选择 DeepSeek API&#xff0c;而非私有化部署&#xff1f; 在开始搭建智能体之前&#xff0c;我想先说明 为什么推荐使用 DeepSeek API&#xff0c;而…

lidar和imu的标定(三)平面约束的方法

看了一篇&#xff1a;基于平面特征的地面机器人雷达-惯性里程计外参标定方法&#xff1b; 它和GRIL-Calib不同之处&#xff0c;就是采用了平面优化和栅格优化。 栅格优化就不介绍了&#xff0c;感觉工程上不。 平面优化则很容易懂&#xff0c;就是标定出来了激光雷达到IMU之…

CppCon 2014 学习: C++ on Mars

主要介绍了如何在火星探测器的飞行软件中使用 C。&#xff1a; 介绍了火星探测器&#xff08;如 Sojourner, Spirit, Opportunity, Curiosity, Perseverance&#xff09;。强调其复杂性和自主性。 延迟的现实&#xff1a;地球与火星之间的通信时延 单程信号延迟为 4 到 22 分…

【MFC】初识MFC

目录 01 模态和非模态对话框 02 静态文本 static text 01 模态和非模态对话框 首先我们需要知道模态对话框和非模态对话框的区别&#xff1a; 模态对话框是一种阻塞时对话框&#xff0c;它会阻止用户与应用程序的其他部分进行交互&#xff0c;直到用户与该对话框进行交互并关…

C#数字图像处理(二)

文章目录 1.灰度直方图1.1 灰度直方图定义1.2 灰度直方图编程实例 2.线性点运算2.1线性点运算定义2.2 线性点运算编程实例 3.全等级直方图灰度拉伸3.1 灰度拉伸定义3.2 灰度拉伸编程实例 4.直方图均衡化4.1 直方图均衡化定义4.2 直方图均衡化编程实例 5.直方图匹配5.1 直方图匹…

SOC-ESP32S3部分:24-WiFi配网

飞书文档https://x509p6c8to.feishu.cn/wiki/OD4pwTE8Jift2IkYKdNcSckOnfd 对于WiFi类设备&#xff0c;最重要的功能之一就是联网&#xff0c;WiFi需要联网&#xff0c;就需要知道我们家里路由的账号和密码&#xff0c;像手机类型的高端设备没什么问题&#xff0c;我们可以直接…

使用langchain实现五种分块策略:语义分块、父文档分块、递归分块、特殊格式、固定长度分块

文章目录 分块策略详解1. 固定长度拆分&#xff08;简单粗暴&#xff09;2. 递归字符拆分&#xff08;智能切割&#xff09;3. 特殊格式拆分&#xff08;定向打击&#xff09;Markdown分块 4. 语义分割&#xff08;更智能切割&#xff09;基于Embedding的语义分块基于模型的端到…

(七)【Linux进程的创建、终止和等待】

1 进程创建 1.1 在谈fork函数 #include <unistd.h> // 需要的头文件// 返回值&#xff1a;子进程中返回0&#xff0c;父进程返回子进程id&#xff0c;出错返回-1调用fork函数后&#xff0c;内核做了下面的工作&#xff1a; 创建了一个子进程的PCB结构体、并拷贝一份相…

EMO2:基于末端执行器引导的音频驱动虚拟形象视频生成

今天带来EMO2&#xff08;全称End-Effector Guided Audio-Driven Avatar Video Generation&#xff09;是阿里巴巴智能计算研究院研发的创新型音频驱动视频生成技术。该技术通过结合音频输入和静态人像照片&#xff0c;生成高度逼真且富有表现力的动态视频内容&#xff0c;值得…

Baklib知识中台加速企业服务智能化实践

知识中台架构体系构建 Baklib 通过构建多层级架构体系实现知识中台的底层支撑&#xff0c;其核心包含数据采集层、知识加工层、服务输出层及智能应用层。在数据采集端&#xff0c;系统支持对接CRM、ERP等业务系统&#xff0c;结合NLP技术实现非结构化数据的自动抽取&#xff1…