DFS——深度优先搜索

article/2025/9/13 18:27:55

 


什么是DFS

DFS,中文名深度优先搜索,是一种图的搜索方式,本质上是一种递归。

dfs相当自由,学dfs可能最高境界就和打太极似的,无招胜有招

DFS的经典应用:

 1.全排列

 虽然感觉没有贴题目的必要

        这应该是大多数dfs初学者的入门之题了,对于递归,我想读者要有这样一个概念,在递归的每一个过程中,我们都会取试着解决一个子问题,所以这个观念才是使用好dfs的关键,也就是想清楚当前要干什么,因为我们的每次尝试只不过是规模更小的子问题。

        但是对于第一次接触,想要尝试去理解,还是要借助于递归过程中的递归栈,在理解之后实际上不必过分纠结于dfs的实现细节递归或许本来就反人类?

思路分析: 

所以问题就比较显然了,我们要把全排列问题分解成规模更小的子问题。

那么原问题可以分解为如下问题:

选择第一个数 + 求剩下n-1个数的全排列

那么对于剩下的n-1个全排列怎么求,不用管,是和原问题一样的子问题

直接上代码 :

#include<iostream>
using namespace std;
const int MAXN = 10;
int n,path[MAXN];
bool book[MAXN];
void dfs(int u)
{if(u==n){for(int i = 0 ; i < n ; i++)//选好了n个数,就可以输出了{cout<<path[i]<<" ";}cout<<endl;return;}for(int i = 1 ; i <= n; i++){if(!book[i])//选择一个没有被前面使用过的数作为第一个数{book[i] = true;//用过了就标记一下path[u] = i;//把这个数存下dfs(u+1);//递归去找剩下n-1个数的全排列book[i] = false;//去找下一个可选择的数作为当前数,同时记得把当前数标记为未被使用}}
}
int main()
{cin>>n;dfs(0);return 0;
}

还是稍微解释一下:

1.path数组:

记录每个位置选择的数

2.book数组:

举个例子:

比如第一个数字选了1,然后后面的n-1个数的全排列肯定不能包含1,所以标记一下,就是告诉后面不要再选1了。

为什么后面又要变成false呢,因为比如你现在第一个数选2了,那后面当然可以选1了,所以啊,要把第一个置为false,表示后面可以选1了。

 对于某些还是无法理解的新手或者硬要搞清楚的人:

看看递归过程中的递归栈,这里就演示一下n=3的情况多了我不累死

  • 第一层啊,先选个1

 

  •  然后第二层,1不能选了,就先选小的2

 

  •  只有3了,没得选择,然后,我们发现,第二层是可以选3的,所以现在回溯

  •  再然后

 

  •  一切道理尽在图片中,我相信都可以理解的吧,下面是完整过程的gif

都是一帧一帧画出来的,给点面子

 

特殊的视角:

 众所周知,dfs的名字叫深度优先搜索,是一种遍历图的手段,那么我们这个问题是否以这种角度去理解呢

当然了:

 可以认为是在这个图中搜索

 


http://chatgpt.dhexx.cn/article/MW1vDDkj.shtml

相关文章

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

14天阅读挑战赛 文章目录 1、深度优先搜索&#xff08;Depth-First Search&#xff0c;DFS&#xff09;介绍2、深度优先搜索算法思想3、深度优先搜索算法步骤&#xff1a;4、深度优先搜索算法的应用 1、深度优先搜索&#xff08;Depth-First Search&#xff0c;DFS&#xff09…

第七章:深度优先搜索

不撞南墙不回头-深度优先搜索 广度优先搜索BFS是每次将当前状态能够一步拓展出的所有状态&#xff0c;全部拓展出来依次存入队列。而深度优先搜索是将当前状态按照一定的规则顺序&#xff0c;先拓展一步得到一个新状态&#xff0c;再对这个这个新状态递归拓展下去。如果无法拓…

Java实现深度优先搜索

Java实现深度优先搜索 图的遍历 图的遍历就是访问图中的每个节点并且每个节点只访问一次。但图中有那么多节点&#xff0c;要如何进行访问就是一个问题&#xff0c;所以我们需要有特定的策略来进行访问这些节点。图的访问策略一般有两种&#xff1a;深度优先搜索和广度优先搜…

深度优先搜索

深度优先搜索&#xff1a; 深度优先搜索是对先序遍历的一般化。我们从某个节点开始&#xff0c;先处理&#xff0c;并将标记为已知&#xff0c;然后任意选择的一个邻接顶点&#xff0c;对其进行深度优先搜索&#xff0c;这样就递归的遍历了图的所有顶点。当图中有圈时&#xf…

【基础知识】一文看懂深度优先算法和广度优先算法

概览 先上个图 现在我们要访问图中的每个节点&#xff0c;即图的遍历。 图的遍历是指&#xff0c;从给定图中任意指定的顶点&#xff08;称为初始点&#xff09;出发&#xff0c;按照某种搜索方法沿着图的边访问图中的所有顶点&#xff0c;使每个顶点仅被访问一次&#xff…

深度优先搜索(DFS),看这一篇就够了。

一&#xff0c;定义&#xff1a; 深度优先搜索的思路和树的先序遍历很像&#xff0c;下面是百度百科上的定义&#xff1a; 深度优先遍历图的方法是&#xff0c;从图中某顶点v出发&#xff1a; &#xff08;1&#xff09;访问顶点v&#xff1b; &#xff08;2&#xff09;依次从…

Python实现深度优先遍历(DFS)和广度优先遍历(BFS)

一&#xff0c;简介 深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath First Search)是图论中两种非常重要的算法&#xff0c;生产上广泛用于拓扑排序&#xff0c;寻路(走迷宫)&#xff0c;搜索引擎&#xff0c;爬虫等&#xff0c;也频繁出现在 leetcode&am…

算法数据结构——图的遍历之深度优先搜索算法(Depth First Search)

1. 深度优先搜索简介 深度优先搜索算法&#xff08;Depth First Search&#xff09;&#xff1a;英文缩写为 DFS。是一种用于搜索树或图的算法。所谓深度优先&#xff0c;就是说每次都尝试向更深的节点走。 深度优先搜索采用了回溯思想&#xff0c;该算法沿着树的深度遍历树的节…

【新书速递】实用安全多方计算导论

安全多方计算&#xff08;MPC&#xff09;是解决数据安全与隐私保护问题的关键安全数据交换技术&#xff0c;近年来发展迅速&#xff0c;但由于MPC涉及复杂的密码学和工程实现技术&#xff0c;行业长期缺乏同时具备MPC研究、应用和实现能力的综合性人才&#xff0c;这阻碍了MPC…

百万富翁问题--安全多方计算

百万富翁问题—安全多方计算 是由图灵奖获得者姚期智提出的。 有A、B两个富翁&#xff0c;A资产i亿元&#xff0c;B资产j亿元&#xff0c;i、j均在0-10范围内&#xff0c;在互不让对方知道自己资产的情况下&#xff0c;比较A和B的资产谁多谁少。 那么如何去比较呢&#xff1f;…

隐私保护技术之安全多方计算

安全多方计算(Secure Multi-Party Computation&#xff0c;SMPC)用于解决一组互不信任的参与方各自持有秘密数据&#xff0c; 协同计算一个既定函数的问题。安全多方计算在保证参与方获得正确计算结果的同时&#xff0c;无法获得计算结果之外的任何信息。 在整个计算过程中&…

基于同态加密体制的安全多方计算

本文首发公众号VenusBlockChain&#xff0c;关注公众号后可免费阅读&#xff01;VenusBlockChain致力于区块链技术研究&#xff0c;传播区块链技术和解决方案、区块链应用落地、区块链行业动态等。有兴趣的小伙伴们&#xff0c;欢迎关注。 安全多方计算&#xff08;Secure Mu…

多方安全计算

说明&#xff0c;本文是转载的&#xff0c;个人觉得作者讲解清晰明了&#xff0c;收录用于学习&#xff0c;原文链接&#xff1a;https://blog.csdn.net/yuxinqingge/article/details/104588197。 如今&#xff0c;互联网已经完成了从IT时代向DT时代转变&#xff0c;数据已经成…

多方安全计算MPC

1.多方安全计算的价值 MPC是密码学的一个重要分支&#xff0c;旨在解决一组互不信任的参与方之间保护隐私的协同计算问题&#xff0c;为数据需求方提供不泄露原始数据前提下的多方协同计算能力。 在目前个人数据毫无隐私的环境下&#xff0c;对数据进行确权并实现数据价值显得…

安全多方计算(MPC)

MPC既适用于特定的算法&#xff0c;如加法、乘法、AES&#xff0c;集合交集等&#xff1b;也适用于所有可表示成计算过程的通用算法。 根据计算参与方个数不同&#xff0c;可分为只有两个参与方的2PC和多个参与方&#xff08;≥3&#xff09;的通用MPC 1&#xff09;安全两方&a…

安全多方计算之二:一文搞懂百万富翁问题

百万富翁问题 1. 解决方案2. 协议描述3. 协议说明4. 协议举例5. 协议扩展 两个百万富翁Alice和Bob想知道他们两个谁更富有&#xff0c;但他们都不想让对方及其他第三方知道自己财富的任何信息&#xff0c;这是由中国计算机科学家、2000年图灵奖获得者姚启智教授于1982年在论文《…

安全多方计算-入门学习笔记(三)

四、基于非噪音的安全多方计算介绍 1概念 非噪音方法一般是通过密码学方法将数据编码或加密&#xff0c;得到一些奇怪的数字&#xff0c;而且这些奇怪的数字有一些神奇的性质&#xff0c;比如看上去很随机但其实保留了原始数据的线性关系&#xff0c;或者顺序明明被打乱但人们…

基于隐私保护的安全多方计算区块链融合技术的智能合约

安全多方计算与区块链的融合技术 SMPC-安全多方计算综述安全的定义安全模型SMPC效率问题 区块链应用&#xff1a;智能合约智能合约的问题SMPC需求引入 基于SMPC的智能合约辅助&#xff1a;MPI协议-效率提升 SMPC-安全多方计算综述 随着物联网、移动计算、大数据、云计算的快速…

安全多方计算之GMW协议

安全多方计算之GMW协议 一、背景 论文原文《How to play any mental game》。作者&#xff1a;Micali S, Goldreich O, Wigderson A. 发表在&#xff1a;Proceedings of the Nineteenth ACM Symp on Theory of Computing, STOC. GMW协议可以同时适用在布尔电路和算术电路&am…

多方安全计算概述

多方安全计算&#xff08;Secure Multi-Party Computation&#xff0c; MPC&#xff09;是密码学的一个分支&#xff0c;在无可信第三方的情况下&#xff0c;仍可安全地按照公开的计算逻辑&#xff0c;进行数据协同计算&#xff0c;并输出结果。 即使参与各方输入的数据只有自…