首页 > 其他分享 >树链剖分

树链剖分

时间:2024-02-17 20:55:05浏览次数:26  
标签:剖分 儿子 编号 树链 重链 节点

树链剖分分为重链剖分和长链剖分

重链剖分

首先是重链剖分,树链剖分顾名思义是一种将代码大小增加1k树剖成一条条链的方法。

定义:

  • 重儿子 该节点所有儿子中以该儿子为根的子树最大的儿子
  • 重边 连接该节点与该节点的重儿子的那条边
  • 重链 由根节点或一个轻儿子为链头一路重边连到叶子节点的链

总结一下就是将一棵树的每一个点给上一个新的编号,每个点的编号就是每个点(在先遍历重儿子后其他儿子的规则下)的 dfn 序列

这么重新编号完之后就可以得到几个规律:

  • 每条重链的编号从上往下是连续的 --- 因为先遍历重儿子
  • 每棵子树的编号是连续的 -- 因为是 dfn 序
  • 如果边(u, v)为轻边,$Size(v) \le Size(u)/ 2$
  • 树中任意两个节点之间的路径中轻边的条数不会超过 $log_{2}n$,重路径的数目不会超过 $log_{2}n$。

由上面这些规则我们不难发现许多树上操作可以被分为多个连续区间的区间操作解决,所以我们就想到了树状数组,线段树等等等等与其配套使用。

P.S:剖完后要注意哪里用的是原 id,哪里用的是重排过的 dfn 序。

例题见于 题单

标签:剖分,儿子,编号,树链,重链,节点
From: https://www.cnblogs.com/Assassins-Creed/p/18018383

相关文章

  • 树链剖分
    看逆天算法,品百味OI#41.重链剖分给出如下定义:重子结点:一个点的子节点中子树最大的点轻子节点:剩余的子节点重边:该节点到重子节点的边轻边:到轻子节点的边重链:若干条首尾相接的重边预处理由两个DFS实现DFS1:记录节点的父节点、深度、子树大小、重子结点DFS......
  • 重链剖分
    重链剖分优先走重儿子,路径跳不超过\(O(\logn)\)intsiz[N],fa[N],dep[N],top[N],dfn[N],hson[N],dfc;//注意每个都要处理voiddfs1(intx,intFa){ fa[x]=Fa; siz[x]=1; hson[x]=0; for(inti=h[x];i;i=e[i].ne){ inty=e[i].to; if(y==Fa)continue; dep[y]=dep[......
  • 树链剖分学习笔记
    树链剖分,计算机术语,指一种对树进行划分的算法,它先通过轻重边剖分将树分为多条链,保证每个点属于且只属于一条链,然后再通过数据结构(树状数组、BST、SPLAY、线段树等)来维护每一条链。——百度百科重链剖分概念1重儿子一个父节点的所有儿子中,子树节点最大(siz最大)的节点。记......
  • 链剖分
    重链剖分第一次DFS求重儿子(子节点更多的儿子)。第二次DFS求重链剖分(先访问重儿子再访问其他轻儿子)。变量:重儿子,子树大小,DFS序(\(x\)根子树DFS序中第一次出现位置),以\(x\)为根的子树的最后一次出现位置,深度,\(x\)所在重链的顶端。voiddfs1(intx){//求出重儿子,sz[v]......
  • 树链剖分
    son[x]表示节点\(x\)的重儿子,若为\(0\),则说明\(x\)为叶子节点id[x]表示节点\(x\)的dfs序编号f[x]表示节点\(x\)的父节点dep[x]表示节点\(x\)的深度sz[x]表示节点为\(x\)的子树的大小top[x]表示x所在重链顶部的节点函数原型voiddfs1(llu,llfa)功能:计算dep[]、f[]、sz[]和......
  • 【动态规划】长链剖分优化树形 dp
    我们在树形dp中经常会遇到这样一个模型:设\(f_{x,i}\)表示节点\(x\)的子树中深度为\(x\)的答案...有递推式:\(f_{x,i}=\sum_{son}f_{son,i-1/i+1}\dots\)。这样直接做是\(\Theta(n^2)\)的,我们考虑去优化这个dp。有一个小优化,就是我们想让\(f_x\)直接继承......
  • 【树链剖分】P3401 洛谷树 题解
    P3401考虑先将路径权值进行转化,因为很难对路径直接进行统计。考虑如何表示出这条路径的权值。记\(s_i=\oplus_{j\in\text{path}(1,i)}w_j\),其中\(\text{path}(i,j)\)表示\(i\)到\(j\)的路径上的边集。则\(u\tov\)的路径的权值为\(s_u\opluss_v\)。现在转变为......
  • 重链剖分的另一个性质
    我们大家都知道树的节点深度和是比树的节点高度和要大的,这个直观感受一下就能理解。什么时候这俩东西一样呢?答案是树形态形如一条链的时候。回忆重链剖分,重链剖分的一个性质是如果说我们把所有重链缩成一个点,形成的新树上节点深度最大是\(\logn\)级别,当然用完全二叉树就能把深......
  • 树链剖分
    树链剖分一、树链剖分的概念和写法1.1概念定义:树链剖分用于将树分割成若干条链的形式,以维护树上路径的信息。具体来说,将整棵树剖分为若干条链,使它组合成线性结构,然后用其他的数据结构维护信息。树链剖分(树剖/链剖)有多种形式,如重链剖分,长链剖分和用于Link/cutTree的剖分(有......
  • 重链剖分
    前置芝士:线段树,或树状数组,越熟练越好。(当然这不是意味着你不会线段树就看不懂这篇博客。)1.何为树链剖分树链剖分,简而言之,就是将树分成一条条链,然后用数据结构去维护这些链,以支持树上两点间的各种询问操作。据我所知,树链剖分大约有三种,分别是重链剖分、长链剖分和实链剖分。其......