蒟蒻浅谈树链剖分之一——两个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序和树链剖分. ...
随机推荐
- [MySQL] mysql int后面的数字与前导零填充
1.int或者tinyint等数值型字段的存储范围已经是固定的,和类型相关2.后面的数字只与显示有关,并且是在开启了zerofill前导零填充的前提下 3.显示的时候,在前面用0补全了 create ...
- 【eclipse】eclipse报错:the resource is not on the build path of a java project
最近在eclipse中,使用svn导入svn上的一个maven项目,但是导入后类的包并没有以源码包的方式显示,而是以普通文件包的方式显示出来,在对类进行F3等操作时就报错:“the resource ...
- 面试题之(js实现当年剩余时间倒计时程序)
js实现当年剩余时间倒计时程序,请看代码: <script> function counter() { var date = new Date(); var year = date.get ...
- Dynamics CRM教程:制作普通图表并放入仪表盘中
关注本人微信和易信公众号: 微软动态CRM专家罗勇,回复143或者20150325可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 我有个小需求,就是看我家特 ...
- JDBC操作MySQL数据
对原始jdbc进行封装 package com.utils; import java.sql.Connection; import java.sql.DriverManager; import jav ...
- Fragment与Activity的接口回调
这里说一个官方推荐的写法: private OnFragmentInteractionListener mListener; @Override public void onAttach(Contex ...
- MySQL常用数值函数
数值函数: 用来处理很多数值方面的运算,使用数值函数,可以免去很多繁杂的判断求值的过程,能够大大提高用户的工作效率. 1.ABS(x):返回 x 的绝对值 mysql> select abs(- ...
- 一致性哈希算法----nginx负载均衡器配置之一
一直性Hash算法在很多场景下都有应用,尤其是在分布式缓存系统中,经常用其来进行缓存的访问的负载均衡,比如:redis等<k,v>非关系数据库作为缓存系统.我们首先来看一下采用取模方式进行 ...
- LeetCode算法题-Construct the Rectangle(Java实现)
这是悦乐书的第243次更新,第256篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第110题(顺位题号是492).对于Web开发人员,了解如何设计网页的大小非常重要.因此 ...
- Linux Collection:网络配置
PAS 缺少ifconfig 安装相应软件[不推荐],尽量使用 ip 命令 sudo apt install gnome-nettool 补充,显示IP地址: ip show address PAS ...