树链剖分,顾名思义就是将树形的结构剖分成链,我们以此便于在链上操作

首先我们需要明白在树链剖分中的一些概念

重儿子:某节点所有儿子中子树最多的儿子

重链:有重儿子构成的链

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操作的更多相关文章

  1. 浅谈树链剖分 F&Q

    这是一篇迟来的博客,由于我懒得写文章,本篇以两个问题阐述笔者对树链剖分的初步理解. Q1:树链剖分解决什么问题? 树链剖分,就是把一棵树剖分成若干连续的链,将这些链里的数据映射在线性数组上维护.比方说 ...

  2. 浅谈树链剖分(C++、算法、树结构)

    关于数链剖分我在网上看到的有几个比较好的讲解,本篇主要是对AC代码的注释(感谢各位witer的提供) 这是讲解 http://www.cnblogs.com/kuangbin/archive/2013 ...

  3. 树链剖分求LCA

    树链剖分中各种数组的作用: siz[]数组,用来保存以x为根的子树节点个数 top[]数组,用来保存当前节点的所在链的顶端节点 son[]数组,用来保存重儿子 dep[]数组,用来保存当前节点的深度 ...

  4. BZOJ.1036 [ZJOI2008]树的统计Count ( 点权树链剖分 线段树维护和与最值)

    BZOJ.1036 [ZJOI2008]树的统计Count (树链剖分 线段树维护和与最值) 题意分析 (题目图片来自于 这里) 第一道树链剖分的题目,谈一下自己的理解. 树链剖分能解决的问题是,题目 ...

  5. HDU 3966 (树链剖分+线段树)

    Problem Aragorn's Story (HDU 3966) 题目大意 给定一颗树,有点权. 要求支持两种操作,将一条路径上的所有点权值增加或减少ai,询问某点的权值. 解题分析 树链剖分模板 ...

  6. hdu 3966 Aragorn's Story(树链剖分+树状数组/线段树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3966 题意: 给出一棵树,并给定各个点权的值,然后有3种操作: I C1 C2 K: 把C1与C2的路 ...

  7. Qtree3题解(树链剖分(伪)+线段树+set)

    外话:最近洛谷加了好多好题啊...原题入口 这题好像是SPOJ的题,挺不错的.看没有题解还是来一篇... 题意: 很明显吧.. 题解: 我的做法十分的暴力:树链剖分(伪)+线段树+\(set\)... ...

  8. Qtree3题解(树链剖分+线段树+set)

    外话:最近洛谷加了好多好题啊...原题入口 这题好像是SPOJ的题,挺不错的.看没有题解还是来一篇... 题意 很易懂吧.. 题解 我的做法十分的暴力:树链剖分(伪)+线段树+ std :: set ...

  9. 树链剖分&dfs序

    树上问题 很多处理区间的问题(像是RMQ,区间修改).可以用线段树,树状数组,ST表这些数据结构来维护.但是如果将这些问题挪到了树上,就不能直接用这些数据结构来处理了.这时就用到了dfs序和树链剖分. ...

随机推荐

  1. 深入了解浏览器存储:对比Cookie、LocalStorage、sessionStorage与IndexedDB

    摘要: 对比Cookie.LocalStorage.sessionStorage与IndexedDB 作者:浪里行舟 Fundebug经授权转载,版权归原作者所有. 前言 随着移动网络的发展与演化,我 ...

  2. 转:从输入url到显示网页发生了什么

    在浏览器中输入url到显示网页主要包含两个部分: 网络通信和页面渲染 互联网内各网络设备间的通信都遵循TCP/IP协议,利用TCP/IP协议族进行网络通信时,会通过分层顺序与对方进行通信.分层由高到低 ...

  3. 推荐一款好用的office转换PDF工具

    北京博信施科技有限公司是一家专业从事数据格式转换.数据处理领域研发软件产品和解决方案实施的技术型公司.在当今信息时代,PDF文档格式是在Internet上进行电子文档发行和数字化信息传播的理想文档格式 ...

  4. Android连续点击多次事件的实现

    有时候我们需要实现这样的场景,类似进入开发者模式,即多次点击后执行操作. 首先我们先看一个方法: System提供的一个静态方法arraycopy(),我们可以使用它来实现数组之间的复制. publi ...

  5. Eclipse插件开发教程-插件的导出和安装应用

    Eclipse插件可以给开发人员提供不少便利,在很多场景下,插件甚至是必不可少的.那么怎么自己开发一个插件呢?前面两篇讲了怎么开发插件,那么开发完了Eclipse插件之后,怎么使用呢?下面就讲讲插件的 ...

  6. unity can't add the script behaviour CallbackExecutor. The script needs ...

    记一次Unity3D小问题 当我打开VS2017编辑完C#脚本,要将脚本拖到一个3D组件上时,发生了以下错误 unity can't add the script behaviour Callback ...

  7. 模拟ES6中的Promise实现,让原理一目了然

    简介 Promise 对象用于延迟(deferred) 计算和异步(asynchronous )计算.一个Promise对象代表着一个还未完成,但预期将来会完成的操作.Promise 对象是一个返回值 ...

  8. Hive之SerDe&Beeline

    一.SerDe SerDe:Serializer and Deserializer 序列化及反序列化,构建在数据存储和执行引擎之间,对两者实现解耦. Hive通过ROW FORMAT DELIMITE ...

  9. python开发规范和(configparser、random模块)

    目录结构: bin:存放程序入口,程序启动文件. conf:存放配置文件,配置文件主要是一些全局变量,路径信息等. core:程序核心文件,不涉及到业务逻辑. app:存放和系统业务相关的逻辑. db ...

  10. FPGA驱动VGA显示静态图片

    一 .前言 本文设计思想采用明德扬至简设计法.VGA是最常见的视频显示接口,时序也较为简单.本文从利用显示屏通过VGA方式显示测试图案及静态图片着手带大家接触图像显示应用,算是为后续VGA显示摄像头采 ...