首页 > 其他分享 >DFS 序

DFS 序

时间:2023-11-19 22:37:10浏览次数:30  
标签:color text DFS 为根 节点 red

  最近接触到一些 DFS 序的题,它可以用来解决一些关于子树的问题。

  DFS 序本质就是一棵树在深度优先搜索时访问节点的顺序。比如有下面一棵树,其 DFS 序就是 $1 \; 2 \; 4 \; 7 \; 8 \; 5 \; 3 \; 6 \; 9$。

  DFS 序有一个很重要的性质,以节点 $u$ 为根的子树中所有的节点在 DFS 序中是连续的一段,并以 $u$ 开头。比如上图中,以 $2$ 为根的子树就有 $1 \; [{\color{red}{2}} \; {\color{red}{4}} \; {\color{red}{7}} \; {\color{red}{8}} \; {\color{red}{5}}] \; 3 \; 6 \; 9$。以 $6$ 为根的子树就有 $1 \; 2 \; 4 \; 7 \; 8 \; 5 \; 3 \; [{\color{red}{6}} \; {\color{red}{9}}]$。以 $5$ 为根的子树就有 $1 \; 2 \; 4 \; 7 \; 8 \; [{\color{red}{5}}] \; 3 \; 6 \; 9$,以此类推。

  如何求得以 $u$ 为根的棵子树在 DFS 序中对应的连续一段序列的左端点和右端点呢?定义 $\text{tin}_u$ 表示第一次访问到节点 $u$ 的时间,对应序列的左端点。定义 $\text{out}_u$ 表示访问完以 $u$ 为根的子树的时间,对应序列的右端点。可以通过以下代码求出每个节点的 $\text{tin}$ 和 $\text{tout}$。

void dfs(int u, int pre) {
    tin[u] = ++sz;
    for (int i = head[u]; i != -1; i = ne[i]) {
        if (e[i] != pre) {
            dfs(e[i], u);
        }
    }
    tout[u] = sz;
}

  上图中每个节点的 $\text{tin}$ 和 $\text{tout}$ 就是:

节点编号 $1$ $2$ $4$ $7$ $8$ $5$ $3$ $6$ $9$
$\text{tin}$ $1$ $2$ $3$ $4$ $5$ $6$ $7$ $8$ $9$
$\text{tout}$ $9$ $6$ $5$ $4$ $5$ $6$ $9$ $9$ $9$

  DFS 序可以将树形结构转换成序列的形式,这使得在子树上进行的修改和查询操作可以转换为区间修改和区间查询,而区间的操作可以结合线段树或树状数组来优化。比如如果修改操作为给某个子树中的节点都加上一个值,查询操作为求某个节点的值。那么就可以求出 DFS 序,然后用树状数组维护一个差分数组,就变成了区间修改,单点查询。当给以 $u$ 为根的子树中的节点都加上 $c$,那么在差分数组中有 $d_{\text{tin}_u} \gets d_{\text{tin}_u} + c$,$d_{\text{tout}_u + 1} \gets d_{\text{tout}_u + 1} - c$。查询某个节点的值则对差分数组求前缀和即可。

  其他更多关于 DFS 序的应用可以参考博文

 

参考资料

  DFS 序入门:https://www.luogu.com.cn/blog/p6174/dfs-xu-ru-men

  dfs序和欧拉序:https://www.cnblogs.com/stxy-ferryman/p/7741970.html

标签:color,text,DFS,为根,节点,red
From: https://www.cnblogs.com/onlyblues/p/17842407.html

相关文章

  • 深度优先搜索(DFS)
    深度优先搜索(DFS)我们以二叉树的遍历为例子。先序遍历遍历过程访问根节点先序遍历其左子树先序遍历其右子树中序序遍历遍历过程中序遍历其左子树访问根节点中序遍历其右子树后序遍历遍历过程后序遍历其左子树后序遍历其右子树访问根节点我们使用数组来模拟......
  • HDFS
    目录HDFS1、HDFS概述1.1hdfs产生背景和意义1.2HDFS优缺点1.3HDFS组成架构1.4HDFS文件块大小2、HDFS的Shell(命令)3、API4、HDFS的读写流程(面试重点)4.1.1写入流程4.1.2网络拓扑-节点距离计算4.1.3机架感知4.2HDFS读数据流程5、NameNode和SecondaryNameNode5.1NN和2NN的......
  • dfs回溯算法,拨号
    题目电话号码的字母组合给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按任意顺序返回。给出数字到字母的映射如下(与电话按键相同)。注意1不对应任何字母。示例1:输入:digits="23"输出:["ad","ae","af","bd","be","bf","cd","ce",......
  • DFS和BFS
    DFS: acwing842递归搜索树 1#include<iostream>2usingnamespacestd;34constintN=10;5intn;6intpath[N];7boolst[N];89voiddfs(intu)10{11if(u==n)//一个分支走到头12{13for(inti=0;i<n;i++)......
  • CF1316D Nash Matrix(构造/dfs)
    题目第一次做构造题,做了两节晚自习qwq一开始我完全是正着想,首先\(X\)是显然的,但其他的点就不好做了,然后我就想,可行的一般结论推不出,那就想反例,然后我想啊想......倒是想到了几个,比如说环与环之间不能有相交,环内外的点不能互相到达,跟本举不完,而且也不好实现,还是要想一般结论......
  • 编译Fastdfs报错——In file included from ../common/fdfs_global.c:21:0: ../common
    记录一下安装fastdfs时编译报错,报错信息如下:原因:这是因为我们在安装较新版得fastdfs时,从github下载得安装包缺少文件,如果按照网上很多博主较早之前写的文档操作得话就会出现这样得错误,缺少了libserverframe网络框架解决方法:安装 libserverframe网络框架安装包下载地......
  • 分布式文件系统FastDFS
    目录目前系统存在的缺点分布式文件系统FastDFS介绍概念架构文件上传文件下载目前系统存在的缺点目前是通过tomcat提供虚拟目录的方式供用户访问;当然也可以通过nginx实现静态资源访问的方式文件冗余在tomcat挂了的情况下不能提供服务;目前是单一文件服务的存储(依赖tomcat不能进......
  • HDFS集群压测实践
    1.背景在部署Hadoop集群时,作为集群运维人员,往往需要了解集群性能。即集群能够处理数据的上限,集群的瓶颈等信息。特别是在上线一批尚未使用过的机型、磁盘时,更需要了解这些硬件上的变更是否会对集群整体性能有影响。本文介绍当DataNode挂载juicefs情况下,集群的性能表现;并且和只挂......
  • HDFS基于Ranger鉴权原理
    1.背景在HDFS中,默认是通过setacl和getacl命令的方式增加和查询hdfs的acl信息。为了了解acl信息,需要亲自登陆机器执行hdfs命令,对于没有机器权限的业务人员非常不友好;同时,运维人员无法浏览HDFS所有acl信息,对于管理来说也不透明。为了解决该问题,引入了Ranger组件,将acl信息存放到Ran......
  • PySpark判断Hdfs文件路径是否存在
    背景从ScalaSpark代码转PySpark代码,同时实现连续读多个文件,避免因某些路径不存在导致程序终止。在Scala的Spark中可以直接导下面两个模块的包importorg.apache.hadoop.conf.Configurationimportorg.apache.hadoop.fs._然后调用方法就可以实现对hdfs的文件判断了valfs=......