有向图深度优先

2023-11-11

1)深度优先遍历(deep first traverse)

定义:假设给定图G的初态是所有顶点均未曾访问过,在G中任选一顶点v为初始出发点(源点),则深度优先遍历可定义如下:首先访问出发点v,并将其标记为已访问过;然后依次从v出发搜索v的每个邻接点w。若w未曾访问过,则以w为新的出发点继续进行深度优先遍历,直至图中所有和源点v有路径相通的顶点(亦称为从源点可达的顶点)均已被访问为止。若此时图中仍有未访问的顶点,则另选一个尚未访问的顶点作为新的源点重复上述过程,直至图中所有顶点均已被访问为止,这里定义使用的就是递归定义。

图的深度优先遍历类似于树的前序遍历,采用的搜索方法的特点是尽可能先对纵深方向进行搜索。这种搜索方法称为深度优先搜索(Depth-First Search)。相应地,用此方法遍历图就很自然地称之为图的深度优先遍历

递归方式实现深度遍历的编码思想:所谓深度优先就是以纵向优先的方式遍历节点。我们从当前节点curr出发,如果当前节点被访问过,就返回,否则将该节点标记为访问过的节点,然后在递归访问当前节点的所有邻接节点。

伪代码:

  function traverse(Node node){    //递归方式实现的深度优先遍历
          if(node.isVisited){    //如果当前节点已经被访问过
              return;            //这个是递归出口
          }
          node.isVisited=true;   //将当前节点置为已经访问
          for(var i=0;i<node.brother.length;i++){
              traverse(node.brother[i]);   //访问当前node的所有邻接节点
          }
          return;       //结束
      }

栈和回溯方式实现深度遍历的编码思想:首先我们需要一个栈结构来存放需要被访问的节点,当然栈的第一个元素是我们传入的node节点,如果这个栈里面还有节点的话,拿出栈顶节点,访问该节点,然后将这个节点的所有未被访问的邻接节点压入栈中,具体过程请看下图:

首先1入栈,1出栈,1被标记为被访问,1的邻接节点2,7,8入栈,8出栈,8被标记为被访问,8的邻接节点9,12入栈,现在栈中的节点为2,7,9,12,然后12出栈,12被访问,由于12没有邻接节点,所以没有节点被加入,9出栈,9被访问,10,11入栈,现在栈中的节点是2,7,10,11,接下来11出栈,11被访问,由于11没有邻接节点,所以没有节点被加入,10出栈,10被访问,现在栈中的节点为2,7,接下来的依次类推即可,下面的代码就描述了这个过程。

伪代码:

function dft(Node node){ //栈方式实现的深度优先遍历,栈回溯法
var stack=[],temp;
stack.push(node); //初始化栈结构,将当前要访问的节点放入栈中
while(stack.isNotEmpty()){
temp=stack.pop(); //拿到当前要访问的节点
temp.isVisited=true; //将当前节点置为已经访问
for(var i=0;i<temp.brother.length;i++){
if(!temp.brother[i].isVisited){
stack.push(temp.brother[i]); //将当前节点未被访问的邻接节点加入栈中
}
}
}
}
(2)广度有限遍历(broad first traverse)

定义:广度优先遍历是连通图的一种遍历策略,它的思想是从一个顶点V0开始,辐射状地优先遍历其周围较广的区域。也就是从V0出发,访问V0的各个未曾访问的邻接点W1,W2,…,Wk;然后,依次从W1,W2,…,Wk出发访问各自未被访问的邻接点;

队列实现广度优先遍历思想:所谓的广度优先指的是从当前节点curr出发,将该节点标记为已经访问过的节点,然后在依次访问curr的没有被访问的邻接节点,然后在依次访问邻接节点的邻接节点,直到所有的节点被访问。具体过程请看下图:

首先,1入队,1出队,1被访问,2,7,8入队,2出队,2被访问,3,6入队,现在队列为7,8,3,6,然后7出队,由于没有和7邻接的节点,依次没有节点入队,8出队,8被访问,9,12入队,现在队列为3,6,9,12,接下来3出队,3被访问,4,5入队,依次类推,下面的代码就描述了这个过程。

伪代码:

function bft(Node node){

var queue=[],temp; //队列结构,是待访问的节点队列,这些节点被排了顺序,按顺序被访问

         queue.push(node); //初始化队列结构
         while(queue.isNotEmpty()){   //当队列不为空的时候
            temp=queue.shift();            //取得当前的节点元素
            temp.isVisited=true;           //将当前节点置为已经访问
            for(var i=0;i<temp.brother.length;i++){
                if(!temp.brother[i].isVisited){   //如果当前节点的邻接节点没有被访问过
                    queue.push(temp.brother[i]);  //将这个邻接节点加入待访问队列
                }
            }
         }
     }

(3)总结

使用递归和不使用递归的区别,假设到达目标需要begin->step1->step2->step3->…->stepN->target,其中stepN表示解决方案N,然后递归的方法是先拿到解决N,然后在退一步,拿到解决方案stepN-1,依次类推,直到最终拿到step1解决方案,而非递归方法是先拿到step1,然后在拿step2,最终拿到stepN。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有向图深度优先 的相关文章

  • matlab_非线性优化

    求解非线性问题 min z f x s t c x 0 ceqx 0 Ax b Aeqx beq lb x ub fmincon函数 x fval exitflag output lambda grad hessian fmincon fu
  • linux svn版本管理命令

    1 svn merge回滚 1 先 svn up 保证更新到最新的版本 如2106 2 然后用 svn log 查看历史修改 找出要恢复的版本 如2105 如果想要更详细的了解情况 可以使用svn diff r 2105 2106 文件或目
  • GPU渲染管线之旅

    在这一部分中 我们来谈谈像素处理的前半部分 dispatch和实际的像素着色 事实上 这部分是大多数图形开发者在谈到PS stage时所关心的内容 有关alpha blend和Late Z的内容则会下一篇文章中去探讨 后面我们会看到 在硬件
  • Oauth2.0实现token刷新功能

    扣扣技术分享交流群 1125844267 1 Oauth3 0简介 Oauth2 0是一个授权协议 提供了一种解决用户资源共享问题的思路 它不是一种实现 对于java来说 我们可以利用Spring Security OAuth2来实现 Oa
  • 使用Anaconda 创建指定cuda 版本的虚拟环境

    目的 解决多cuda版本共存问题 首先是安装anaconda 从官网或者是清华源下载安装包 以下用 Anaconda3 2019 10 Linux x86 64 sh 举例 wget https mirrors tuna tsinghua
  • Pycharm 报错 “Could not find conda environment: torch“ 解决办法:通过Anaconda 配置 pytorch 环境

    问题 在 Pycharm 中运行 gt gt gt import torch 报错 Could not find conda environment torch 解决方法 在 pytorch 环境下安装 PyTorch 第一步 以管理员身份
  • 服务器2008装系统教程视频教程,2008服务器系统安装教程视频

    2008服务器系统安装教程视频 2021 02 13 22 34 39 简介 php去除nbsp的方法 首先创建一个PHP代码示例文件 然后通过 preg replace s nbsp xc2 xa0 strip tags val 方法去除
  • WPF 将TextBox更改为PasswordBox样式(文字显示方式为密码格式)

    样式代码
  • 移动应用开发之约束布局

    重点在于找死角区 约束布局在所有布局之中是功能最全 最便捷的布局 可以通过拖拽的方式来实现 由于我总是通过拖拽的方式 导致我看布局文件代码的时候 一脸懵逼 便将约束布局的各个属性整理了下来 父约束 一般值为parent 也可以是id 加id
  • 洛谷P1182-数列分段(详解)

    题目 给定一个长度为n的数列A 要求将它分为m段 要求每段连续 且每段和的最大值最小 N lt 10e5 m lt n Ai之和不超过10e9 这题一看就知道我不会 所以很老实的去看了看题解 题解也真是避重就轻 重要的地方就说 这个要自己思
  • kibana 报错 server is not ready yet

    docker logs kibana打印日志 报错 type log timestamp 2020 06 04T08 25 57Z tags warning elasticsearch admin pid 6 message Unable
  • 蓝桥杯 历届试题 有理数类

    标题 有理数类 有理数就是可以表示为两个整数的比值的数字 一般情况下 我们用近似的小数表示 但有些时候 不允许出现误差 必须用两个整数来表示一个有理数 这时 我们可以建立一个 有理数类 下面的代码初步实现了这个目标 为了简明 它只提供了加法
  • 计算机组成原理课程设计:在复杂模型机上编写机器指令与微程序计算海伦公式

    文章目录 一 实验内容 1 实验目的 2 实验目标 3 实验设备 二 实验原理 1 数据格式 2 指令设计 3 指令格式 4 指令系统 三 总体设计 四 实验步骤 1 按图6连接实验线路 仔细检查连线后打开实验箱电源 2 写入实验程序 并进
  • 解决python中解决No module named XXXX 问题

    百度的时候大部分时间是推荐安装Anaconda3 Anaconda3 强大归强大 但是需要下载并且需要进行配置环境才可以用 如果觉得麻烦 不妨用下面的方式解决 1 首先查看一下module是不是thread 如果你运行的是python3的话
  • Python中绘制离散型colorbar

    可以按照以下步骤进行 1 导入必要的库 matplotlib pyplot 和 matplotlib colors import matplotlib pyplot as plt import matplotlib colors as mc
  • python随机生成英文字母_在Python中生成随机字母

    有没有一种方法可以在Python中生成随机字母 如random randint 但用于字母 random randint的范围功能会很好 但是拥有仅输出随机字母的生成器总比没有好 简单 gt gt gt import string gt g
  • 【办公】word中实现三线表(跨页,续表)

    文章目录 前言 三线表 生成一张表格 设置标题和交叉引用 设置三线表 选中表格的全部 设置边框与底纹 设置跨页 分割成两个表 设置标题行重复 设置续表标识 巧妙用文本框 END 前言 在办公中 一些场景需要将普遍表格设设置为三线表 如 论文
  • HTTP状态 500 - 内部服务器错误之java.lang.ClassNotFoundException: org.apache.jsp.index_jsp

    该错误是由于 jar 包冲突引起 在 Tomcat 中 servlet 和 jsp 的 jar 包和使用 maven 导入的 jar 包产生了冲突 解决方法 将pom xml中以下代码删除 即不使用 maven 中的 jar 包
  • JavaScript图像处理(5) - 曲线操作(Curve Manipulation)

    直方图均衡作为一个自动的方法虽然可以在大多数情况下获得不错的效果 但是很多时候也受限于其单一的功能而无法满足多样化的图像处理需求 尤其是在图像的艺术处理方面 直方图均衡往往并不能达到期望的效果 有时候我们需要增强图像中的高光或者是明亮的背景
  • 使用Map集合作为封装SQL查询结果的场景和注意事项

    一 使用Map集合作为封装SQL查询结果的场景 返回给前端的参数可以看做一个集合里面封装了多个对象 并且返回的字段较少 没有合适的类可以接收 这种时候可以使用Map集合进行接收参数 在XML配置文件中返回值类型可以用Map集合 使用Map集

随机推荐

  • AR地图微信小程序:数字化时代下地图应用的新突破

    随着数字化时代的到来 地图应用成为人们日常生活中不可或缺的工具 而随着增强现实 AR 技术的快速发展 AR地图微信小程序应运而生 为用户提供了一种全新的地图导航体验 本文将深入探讨AR地图微信小程序的专业性和思考深度 并分析其在地图应用领域
  • 有Mysql数据库的情况下为什么要用Hive数据库?

    有Mysql数据库的情况下为什么要用Hive 最近接到公司的一个需求 要求使用Hive做数据查询 当时第一反应就是What Hive是什么鬼 一脸懵逼状 请原谅一个刚开始实习的Java实习生见识短浅 然后发现了hive的一些问题 下面简单介
  • SPSS(二)SPSS实现多因素方差分析模型(图文教程+数据集)

    SPSS 二 SPSS实现多因素方差分析模型 单因素方差分析上一篇博客https blog csdn net LuYi WeiLin article details 89917656已经介绍完毕 这篇博客我们主要来学习多因素方差分析 多因素
  • 给点云添加不同类型的噪声

    1 对于点云 首先要归一化 即将点云最大值归一化为1 matlab代码如下 path which normalization path path 1 end size normalization m 2 fpath fullfile pat
  • getshell神器工具怎么用

    getshell神器工具怎么用 多线程http并发编写出来的扫描工具 速度快 稳定性高 内存占用小扫到的百分之95都是一手的 可以更好的进行安全检测 更会不定时更新exp漏洞完全打破了目前网上所有的后缀扫描方式 tg xise404演示地址
  • 第五章 循环结构程序设计 习题(后五题编程题)

    1 文字 定义整数变量i j n 0 sum i 3 判断i lt 1000值为真走4 否则输出n 结束 执行赋值 sum 0 j 1 j判断
  • [网络安全自学篇] 三十四.Windows系统安全缺陷之5次Shift漏洞启动计算机机理分析

    这是作者的系列网络安全自学教程 主要是关于安全工具和实践操作的在线笔记 特分享出来与博友们学习 希望您们喜欢 一起进步 前文详细讲解了绕狗一句话原理 绕过安全狗的常用方法和过狗菜刀 并实践安装安全狗进行实际测试 本文将分享Windows系统
  • mysql存放double_double在数据库怎么定义 如何将double数组转成二进制存到数据库里...

    double是什么数据类型 它有什么作用 怎么在MYSQL数据库的表中插入一个double型数据 我插入double型数据的时候MYSQL会直接将double型数据四舍五入为整数 如double型的没有设置小数后保留几位 执行下面msqly
  • 股票期权与定价以及用python实现

    期权是一种能在未来特定时间以特定价格买进或卖出一定数量的特定资产的权利 期权交易是一种权利的交易 在交易中 买方在支付了一笔费用 权利金 之后 获得了后约赋予的 在合约规定时间 按事先确定的价格 执行价格 向期权卖方买进或卖出一定数量期货合
  • mysql、redis、nginx等linux搭建

    mysql5 7版本搭建 1 从MySQL Download MySQL Community Server Archived Versions 选择5 7版本64位下载 一般选择5 7版本 2 将mysql压缩包放在服务器 usr loca
  • sqli-labs/Less-26a

    这一关还是提示我们空格和注释符被过滤掉了 可能还是和上一关一样 逻辑运算符也被过滤了 那么和上一关的不同之处可能就在于注入类型的不同 我们首先判断一下注入类型 先判断是否为数字型 输入如下 id 1 0b 26 26 0b1 2 回显如下
  • jquery checkbox选中事件监听

    div span 全选 全不选 span div
  • 深度解析MySQL 5.7之中文全文检索

    InnoDB默认的全文索引parser非常合适于Latin 因为Latin是通过空格来分词的 但对于像中文 日文和韩文来说 没有这样的分隔符 一个词可以由多个字来组成 所以我们需要用不同的方式来处理 在MySQL 5 7 6中我们能使用一个
  • Android InputEventReceiver事件接收流程分析

    本文基于Android 12 InputEvent经过inputflinger读取后 通过Inputchannel发送到Java层的InputEventReceiver对象 输入事件和View的状态强相关 事件发送需要确定当前的焦点App
  • (1)2D绘图详解(QPainter)

    一 Qt绘制事件 当应用程序收到绘制事件时 就会调用QWidget paintEvent 该函数就是绘制窗口的地方 有两种方法要求重绘一个窗口 1 update 把重绘事件添加到事件队列中 重复调用update 会被Qt合并为一次 不会产生
  • 【满分】【华为OD机试真题2023 JAVA&JS】区间连接器

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 区间连接器 知识点数组排序滑窗 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 有一组区间 a0 b0 a1 b1 a b 表示起点 终点 区间有可能重叠 相邻
  • 区块链+光伏产业,阻力更大还是前景更大?

    区块链通过比特币这样的形式 让世人看到了它神奇的一面 想象空间非常大 驱动了诸多领域对它的研究 这使得业内人士对于区块链 光伏产业相结合提出了疑问是阻力大还是前景更大呢 在国内现有的电力交易市场中 电力交易主要掌握在国有电网公司手里 然而
  • 【环形链表】

    目录 前言 一 相交链表 一 题目分析 二 题目代码 二 环形链表 一 题目分析 二 题目代码 三 环形链表 一 解法1 数学分析 公式推导 题目分析 题目代码 二 解法2 切断环 改变问题为相交链表 题目分析 题目代码 三 解法3 改变链
  • New Bing相关设置与解除聊天次数限制

    最近ChatGPT相关的话题很多 之前使用了一下 感觉虽然功能很强大 但是ChatGPT只能查找2021年之前的信息 并且会编造一些虚假信息 例如让其给出一些信息的来源的时候 就会胡乱编造 1 New Bing的优势 New Bing是Ch
  • 有向图深度优先

    1 深度优先遍历 deep first traverse 定义 假设给定图G的初态是所有顶点均未曾访问过 在G中任选一顶点v为初始出发点 源点 则深度优先遍历可定义如下 首先访问出发点v 并将其标记为已访问过 然后依次从v出发搜索v的每个邻