算法详解之深度优先搜索算法

news/2024/7/20 22:04:19 标签: 深度优先, 算法

14天阅读挑战赛

文章目录

1、深度优先搜索(Depth-First Search,DFS)介绍

深度优先搜索(Depth-First Search,DFS)是十分常见的图搜索方法之一。深度优先搜索会沿着一条路径一直搜索下去,在无法搜索时,回退到刚刚访问过的节点。深度优先遍历按照深度优先搜索的方式对图进行遍历。并且每个节点只能访问一次。

深搜优先搜索的本质上就是持续搜索,遍历了所有可能的情况,必然能得到解。DFS搜索的流程是一个树的形式,每次一条路走到黑。

深搜优先搜索最早是使用在开发爬虫早期使用较多的方法。它的目的主要是达到被搜索结构的叶结点:即那些不包含任何超链的HTML文件)。沿着HTML目录层级下探,直到最后一层,然后回退到上层,被访问过的节点会被标记,然后查看是否有其他节点,如果有则继续下突然,直到最后一层。一次类推直到所有节点都被查找。

2、深度优先搜索算法思想

深度优先遍历的秘籍:后访问的节点,其邻接点先被访问。根据深度优先遍历的秘籍,后来的先服务,这可以借助“栈”来实现。递归本身就是使用“栈”实现的,因此使用递归的方法更方便。

深度优先遍历图的方法是,从图中某顶点v出发:
1、访问顶点v;
2、依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;
3、若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。

3、深度优先搜索算法步骤:

  • 初始化图中的所有节点为均未被访问。

  • 从图中的某个节点v出发,访问v并标记其已被访问。

  • 依次检查v的所有邻接点w,如果w未被访问,则从w出发进行深度优先遍历(递归调用,重复步骤(2)和(3))。

4、深度优先搜索算法的应用

应用最多的其实是数字的排列

给定一个整数a,输出一个a位数,总共有多少种方法?

输入格式:
输入一个整数a。

输出格式:
输出所有排列方案,每个方案占一行。

数据范围:
1≤a≤10

输入样例:
3
输出样例:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

我们通过图来展示一下怎么查找的:
在这里插入图片描述
描述:

如图,首先会一路下探到然后回退到_ 发现没法继续,又回退到_ _ 然后一路下探到之后回退、下探……循环往复。知道最后回退到头。

代码实现:

int path[A];
bool st[A];
void dss(int u )
{
    if(u==n)//如果遍历到底了就输出
    {
        for(int i = 0; i < n ; i++)
        cout<<path[i]<<" ";
        cout<<endl;
        return;//回到上一层
    }
    //当u<n时,说明还没填完。
    for(int i = 1 ; i<= n ;i ++)
    {
        if(!st[i])//如果这层i没有被用过。
        {
            path[u] = i;//u深度赋值为i
            st[i] = true;//标记i已近被用过。
            dss(u + 1);//进入下一层
            st[i] = false;//回溯时候要把i重新回到未标记的状态,不用恢复path[u] = 0是因为它会被覆盖
            //然后继续循环
            //循环完了后依然会回到上一层
        }
    }
}

http://www.niftyadmin.cn/n/1622.html

相关文章

数字IC秋招—终章

秋招末尾&#xff0c;简单地写个总结&#xff0c;也算是对写了几个月的博客有个交代&#xff0c;另外也希望可以对同样是自学转行的朋友有一点帮助。 简单说下我的学习背景&#xff0c;双非本&#xff0c;末流211硕&#xff0c;劝退专业&#xff0c;由于硕士期间做的方向的原因…

(附源码)计算机毕业设计SSM教师教学质量评价系统

&#xff08;附源码&#xff09;计算机毕业设计SSM教师教学质量评价系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术…

小侃设计模式(一)-设计模式七大原则

1.概述 设计模式&#xff08;Design Pattern&#xff09;是软件设计领域的一棵长青树&#xff0c;它是一套被反复使用、多人知晓、经过分类编目的、优秀代码设计经验的总结。使用设计模式是为了设计出易理解、可复用、可靠的代码&#xff0c;增强程序的可复用性。设计模式由Er…

基于STM32的自动重装载auto-reload preload以及影子寄存器

目录 写在前面 正文 总结 写在前面 在使用cubeMX开发stm32&#xff0c;会经常用到定时器&#xff0c;并通过定时器产生中断计数来定期地执行某些任务。在配置时会遇到auto-reload preload 。这让熟悉51开发时解触到的定时器产生中断后自动重装载计数值让其产生下一次中断名字…

毛球修剪器方案开发的工作原理和构成

本文介绍了毛球修剪器方案开发的工作原理&#xff1b;不管是羊毛衫、兔子衫还是普通纤维衫&#xff0c;时间一长都不可避免地会有很多毛球。它看起来脏又乱&#xff0c;穿起来特别不雅观。用除毛器剃毛球可以轻松去除毛衣的原始绒毛&#xff0c;而毛衣将失去其原有的保暖性。 原…

中学生作文指导杂志中学生作文指导杂志社中学生作文指导编辑部2022年第22期目录

中学生作文指导杂志中学生作文指导杂志社中学生作文指导编辑部2022年第22期目录 教法探索 试论高中语文阅读教学中批判性思维的培养 (2) 陈生泽 巧用批注式阅读法, 提升高中语文阅读教学效率 (6) 邓晓莉 高中语文课堂学习评价方法探微 (10) 刘秀娟 高中语文“思辨…

饲料板块毛利润分析主逻辑SQL

/dialect/ select “MLR”.“FL” “FL”, “MLR”.“productGroupNumA” “productGroupNumA”, —物料大类代码 “MLR”.“productGroupNameA” “productGroupNameA”, —物料大类名称 “MLR”.“productGroupNum” “productGroupNum”, —物料大类代码 “MLR”.“product…

考研数学——张宇八套卷

第一套 选择题 2、写的时候有那么一瞬间忘了绕y轴旋转的公式了&#xff0c;Vy∫2πxf(x)dxVy\int2\pi xf(x)dxVy∫2πxf(x)dx&#xff0c;一般公式V∫∫D2πrdxdyV\int \int_D 2\pi rdxdyV∫∫D​2πrdxdy4、比较难判断的是第一个和第三个&#xff0c; 第一个lim⁡n→∞[nln(…