蒟蒻浅谈树链剖分之一——两个dfs操作
树链剖分,顾名思义就是将树形的结构剖分成链,我们以此便于在链上操作
首先我们需要明白在树链剖分中的一些概念
重儿子:某节点所有儿子中子树最多的儿子
重链:有重儿子构成的链
dfs序:按重儿子优先遍历时的顺序
轻儿子的意思就与重儿子相反
首先是第一个dfs操作
在本次操作中,我们主要做的是处理所有节点的父亲,子树大小,重儿子,深度等操作
- void dfs1(int now,int father,int deep)
- {
- tree[now].depth=deep;//初始化当前节点的深度,子树大小,父亲
- tree[now].size=;
- tree[now].fa=father;
- maxson=-;
- for(int i=head[now];i;i=tree[i].next)
- {
- int v=tree[now].to;
- if(v==tree[now].father)//因为练的是双向边,所以不免会练到自己的父亲节点,就跳过
- {
- continue;
- }
- dfs(v,now,deep+);
- tree[now].size+=tree[v].size;//累加子树的大小
- if(tree[v].size>maxson)
- {
- tree[now].son=v;
- maxson=size[v];
- }
- }
- }
接下来就是第二次dfs操作,将树剖分成链的过程
我们在这时就有一个非常重要的东西那就是dfs序
dfs序就是我们遍历时的顺序,在这里的遍历方式是二叉树的中序遍历
因为我们在树链剖分中是以重儿子优先
所以dfs序可能会与实际有出入
所以我们还需新开一个数组来维护新的dfs序
以便于我们的线段树操作
但蒟蒻太弱,以后再来讲套线段树的事情
我们先好好的剖分吧
- void dfs2(int now,int topf)//从当前节点开始,topf为当前链的顶端
- {
- tree[now].index=++TIME;//dfs序
- w[tree[now].index]=tree[now].value;//维护
- tree[now].top=topf;//初始化,链顶即为topf
- if(!tree[now].son)//没有重儿子就先不用便利了
- {
- return;
- }
- dfs(tree[now].son,topf);//优先遍历重儿子
- for(int i=head[now];i;i=tree[i].next)//在处理其他的情况
- {
- int v=tree[i].to;
- if(v==father||v==tree[now].son)//不能为自己的父亲节点,也不能为重儿子
- {
- continue;
- }
- dfs(v,v);//在轻儿子那里新开一条链
- }
- }
所以说两个dfs还是比较好理解的
关键的是在树链剖分里更好的套数据结构
欲知后事如何,请听下回分解!
蒟蒻浅谈树链剖分之一——两个dfs操作的更多相关文章
- 浅谈树链剖分 F&Q
这是一篇迟来的博客,由于我懒得写文章,本篇以两个问题阐述笔者对树链剖分的初步理解. Q1:树链剖分解决什么问题? 树链剖分,就是把一棵树剖分成若干连续的链,将这些链里的数据映射在线性数组上维护.比方说 ...
- 浅谈树链剖分(C++、算法、树结构)
关于数链剖分我在网上看到的有几个比较好的讲解,本篇主要是对AC代码的注释(感谢各位witer的提供) 这是讲解 http://www.cnblogs.com/kuangbin/archive/2013 ...
- 树链剖分求LCA
树链剖分中各种数组的作用: siz[]数组,用来保存以x为根的子树节点个数 top[]数组,用来保存当前节点的所在链的顶端节点 son[]数组,用来保存重儿子 dep[]数组,用来保存当前节点的深度 ...
- BZOJ.1036 [ZJOI2008]树的统计Count ( 点权树链剖分 线段树维护和与最值)
BZOJ.1036 [ZJOI2008]树的统计Count (树链剖分 线段树维护和与最值) 题意分析 (题目图片来自于 这里) 第一道树链剖分的题目,谈一下自己的理解. 树链剖分能解决的问题是,题目 ...
- HDU 3966 (树链剖分+线段树)
Problem Aragorn's Story (HDU 3966) 题目大意 给定一颗树,有点权. 要求支持两种操作,将一条路径上的所有点权值增加或减少ai,询问某点的权值. 解题分析 树链剖分模板 ...
- hdu 3966 Aragorn's Story(树链剖分+树状数组/线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3966 题意: 给出一棵树,并给定各个点权的值,然后有3种操作: I C1 C2 K: 把C1与C2的路 ...
- Qtree3题解(树链剖分(伪)+线段树+set)
外话:最近洛谷加了好多好题啊...原题入口 这题好像是SPOJ的题,挺不错的.看没有题解还是来一篇... 题意: 很明显吧.. 题解: 我的做法十分的暴力:树链剖分(伪)+线段树+\(set\)... ...
- Qtree3题解(树链剖分+线段树+set)
外话:最近洛谷加了好多好题啊...原题入口 这题好像是SPOJ的题,挺不错的.看没有题解还是来一篇... 题意 很易懂吧.. 题解 我的做法十分的暴力:树链剖分(伪)+线段树+ std :: set ...
- 树链剖分&dfs序
树上问题 很多处理区间的问题(像是RMQ,区间修改).可以用线段树,树状数组,ST表这些数据结构来维护.但是如果将这些问题挪到了树上,就不能直接用这些数据结构来处理了.这时就用到了dfs序和树链剖分. ...
随机推荐
- 【eclipse】eclipse报错:the resource is not on the build path of a java project
最近在eclipse中,使用svn导入svn上的一个maven项目,但是导入后类的包并没有以源码包的方式显示,而是以普通文件包的方式显示出来,在对类进行F3等操作时就报错:“the resource ...
- Js与jQuery的相互转换
$()与jQuery() jQuery中$函数,根据传入参数的不同,进行不同的调用,实现不同的功能.返回的是jQuery对象 jQuery这个js库,除了$之外,还提供了另外一个函数:jQuery j ...
- webstorm快捷键大全(亲自整理)
Ctrl+/ 或 Ctrl+Shift+/ 注释(// 或者/*…*/ ) Shift+F6 重构-重命名 Ctrl+X 删除行 Ctrl+D 复制行 Ctrl+G 查找行 Ctrl+Shift+Up ...
- 基于 CODING 的 Spring Boot 持续集成项目
本文作者:CODING 用户 - 廖石荣 持续集成的概念 持续集成(Continuous integration,简称 CI)是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少 ...
- Vue组件的is具体用法
1.为什么要使用is 在vue的官网组件部分中,有明确的描述:当使用 DOM 作为模板时 (例如,使用 el 选项来把 Vue 实例挂载到一个已有内容的元素上),你会受到 HTML 本身的一些限制,因 ...
- MVP模式, 开源库mosby的使用及代码分析
Android中的构架模式一直是一个很hot的topic, 近年来Architecture components推出之后, MVVM异军突起, 风头正在逐渐盖过之前的MVP. 其实我觉得MVP还是有好 ...
- Android studio设置文件头,定制代码注释
一.说明 在下载或者看别人的代码我们常会看见,每一个文件的上方有个所属者的备注.如果要是一个一个备注那就累死了. 二.设置方法 File >>> Setting >>&g ...
- MongoDB:配置与安装
一.配置环境 1.1进行安装下载msi文件 需要注意的一点是,在安装过程中的图示界面不要勾选左下角“安装MongoDB可视化工具”.这是一个客户端管理工具,在后面会具体描述其功能.由于安装时间非常长, ...
- centos服务器如何监控访问ip,并将非法ip通过防火墙禁用
centos服务器如何监控访问ip,并将非法ip通过防火墙禁用 上周给朋友帮忙,上架了一款小游戏(年年有鱼),项目刚一上线,就遇到了ddos攻击,阿里云连续给出了6次ddos预警提示,服务器一度处于黑 ...
- windows10 1903 64位系统
近日,微软完成并开始推送Windows 10 2019年的第一个重大升级的预览版本,版本号是v1903,命名则是2019年5月更新版. 点击下载windows10