首页 > 其他分享 >图(树)的深度优先遍历dfs

图(树)的深度优先遍历dfs

时间:2023-12-21 20:45:44浏览次数:36  
标签:优先 遍历 递归 int dfs 深度

图的深度优先遍历

深度优先,即对于一个图或者树来说,在遍历时优先考虑图或者树的单一路径的深度。示意图如下

即深度优先搜索的核心就是对一个路径一直向下搜索,当搜索到头时就回溯到前一状态再寻找别的路

深搜问题一般有两种情况,一种是搜索时元素只能用有限次,这需要我们定义一个全局标记数组来对已经使用的数字进行标记。
如该题 排列数字

这道题的解法就是使用dfs枚举各种情况。当dfs时,其实就是在遍历一棵使用递归建成的搜索树。
题解代码如下

#include <iostream>
using namespace std;
const int N = 20;
int ans[N]; //答案存储数组
int n;
int cnt;    //答案个数记录,用于写递归出口
bool check[N]; // 标记
void dfs()
{
    if(cnt == 3)
    {
        for(int i = 0 ; i < 3 ; i++)
            cout << ans[i] << ' ';
        cout << '\n';
	return;
    }
    for(int i = 1 ; i <= n ; i++)
    {
        if(!check[i])
        {
            ans[cnt++] = i;
            check[i] = true;
            dfs();
            /*回溯*/
            check[i] = false;
            cnt --;
        }
    }
}
int main()
{
    cin >> n;
    dfs();
    return 0;
}

注意!当dfs时一定别忘了写递归出口,递归出口的条件一般就为题目要求的筛选条件

dfs函数中的for循环其实就是枚举每一层的各种情况。

其实本道题还有更为方便的解法,利用algorithm库中的next_permutation函数可以轻松的解决字典序全排列问题。

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 20;
int ans[N]; //答案存储数组
int n;
int main()
{
    cin >> n;
    for(int i = 0 ; i <= n ; i++ )
        ans[i] = i + 1;
    do
    {
        for(int i = 0 ; i < n ; i++)
            cout << ans[i] << ' ';
        cout << '\n';
    }while(next_permutation(ans, ans+n));
    return 0;
}

该函数的作用请见next_permutation

标签:优先,遍历,递归,int,dfs,深度
From: https://www.cnblogs.com/CrescentWind/p/17920077.html

相关文章

  • 如何设置和配置dfsadmin命令
    Hadoop是一个用于处理大规模数据的开源框架,而dfsadmin命令是Hadoop中用于管理分布式文件系统(DFS)的命令。本文将介绍如何设置和配置dfsadmin命令,以便更好地管理和操作Hadoop的分布式文件系统。1.安装Hadoop:首先,需要安装Hadoop并完成基本的配置。可以从Hadoop官方网站下载最新的稳定......
  • 网工内推 | 上市公司,数据库运维,OCP认证优先,14薪
    01税友集团招聘岗位:运维工程师职责描述:1、对税务局端的日常支持与维护,监控局端(或平台)程序、数据库、服务器运行情况;2、税务局端软件测试与升级工作;3、根据税务局用户的咨询以及相关服务人员的反馈,收集局端系统存在的问题并进行故障排查,配合研发处理系统的版本优化;提出日常工作的改......
  • 21_从中序与后序遍历序列构造二叉树
    106.从中序与后序遍历序列构造二叉树给定两个整数数组inorder和postorder,其中inorder是二叉树的中序遍历,postorder是同一棵树的后序遍历,请你构造并返回这颗二叉树。示例1:输入:inorder=[9,3,15,20,7],postorder=[9,15,7,20,3]输出:[3,9,20,null,null,15,7]......
  • [LeetCode22-中等-DFS] 括号生成
    这道题考使用回溯(递归的一种)进行深度优先算法,题目是这样的数字n代表生产括号的对数,写一个算法,返回所有有效的括号组合比如 n=1代表生成1对括号,显然答案就是“()"n=2,代表生成2对括号, 答案就是"()()","(())"n=3代表生成3对括号,答案就是"((()))","()()()","(()())......
  • FastDFS 单机版linux部署笔记
    参考文章:https://blog.csdn.net/qq_20409407/article/details/134201386备忘:fastdfs三部分路径为:/home/fastdfs/tracker/home/fastdfs/storage/home/fastdfs/client#fastdfs命令工具所在路径usr/└──bin/├──fdfs_appender_test├──fdfs_appender_test1├......
  • 集合遍历方式
    packagebackend01;importjava.util.ArrayList;importjava.util.Collection;importjava.util.Iterator;publicclassPractice05{publicstaticvoidmain(String[]args){Collection<String>list=newArrayList<>();//Collection是个接......
  • 【CF1661B】Getting Zero(广度优先搜索)
    题目大意:每次操作可以把\(v\)变成\((v+1)\mod32768\)或\((2\timesv)\mod32768\),求\(v\)变成\(0\)最少需要操作几次。\(v\)等于\(0\)时答案为\(0\),我们将\(0\)标记,然后让\(0\)入队。然后不断进行以下操作,直到队列为空:1.取出队列头部元素,设为\(x\)。2.找出能通过一次操作变......
  • HDFS基本介绍
      HDFS作为Hadoop的核心知识,是必须要掌握的,写这篇文章就是总结出HDFS的最核心知识点,那就开始吧!     一:什么是HDFS     HadoopDistributedFileSystem,简称HDFS,是一个分布式文件系统。HDFS有着高容错性(fault-tolerent)的特点,并且设计用来部署在低廉的(low-c......
  • HDFS命令行操作
    HDFS的命令行操作很多,但是常用的也就那么几个,现在就总结一下吧:HDFS的常用命令:hadoopfs-ls/查看hdfs根目录hadoopfs-put源文件目标地址将本地文件存储到hdfs目标地址hadoopfs-cp源目标拷贝源到目标hadoopfs-copyFromLocalhadoopfs-moveFro......
  • C++ 反向遍历 array 小记
    有时候需要逆向循环,例如从字符串的最右端遍历到最左端,需要注意一些细节!初学遇到一些bug记录在这里。首先arr.size()的数据类型为size_t,为无符号整型对于for(intidx=arr.size()-1;idx>=0;idx--):使用int作为idx的类型,有一定概率会编译失败,因为size_t的具......