树链剖分-重链剖分

news/2025/3/28 2:25:09/文章来源:https://www.cnblogs.com/Kelojonle/p/18787028

树链剖分-重链剖分

前置知识

树形结构,链式前向星,线段树,DFS序,LCA

定义

树链剖分(树剖):将树分解为一条条不相交的,从祖先到孙子的链。

第零部分:建树与基本概念

建树:给定\(n\)个节点用链式前向星(或邻接表)建树

基本概念:

image

  1. 重儿子:假设\(x\)\(n\)个儿子节点,其中以\(i\)儿子节点的为根子树大小最大,\(i\)就是\(x\)的重儿子
  2. 轻儿子:除重儿子外的所有儿子均为轻儿子
    以上图为例
    \(1\)的重儿子为\(3\),轻儿子为\(2\)
    \(3\)的重儿子为\(6\),其余的为轻儿子
  3. 轻边:\(x\)与轻儿子相连的边
  4. 重边:\(x\)与重儿子相连的边
  5. 轻链:均由轻儿子构成的一条链
  6. 重链:均由重儿子构成的一条链

第一部分:对表示节点信息的数组进行预处理

定义以下数组:

  1. \(d[x]\) 表示节点\(x\)的深度
  2. \(fa[x]\) 表示节点\(x\)的父亲节点
  3. \(son[x]\) 表示节点\(x\)儿子
  4. \(siz[x]\) 表示以节点\(x\)为根的子树大小
  5. \(top[x]\) 表示节点\(x\)所在链的顶点

第一次DFS

数组\(d\)\(fa\)\(son\)均可用DFS很方便的求出,而\(siz\)数组则用到了DFS序的思想(详见《算法竞赛进阶指南》第\(0x21\)节)

void DFS1(int now,int dad)//now 为当前节点编号,dad 为其父节点编号
{fa[now] = dad;//记录父节点siz[now] = 1;//子树应算上根节点nowson[now] = 0;//求重儿子的过程涉及到比较//这里是将节点now的重儿子编号赋为0//故以其重儿子为根的子树大小为0(即不存在)d[now] = d[dad] + 1;for(int i = head[now]; i; i = edge[i].Next){if(edge[i].to == dad)//对树进行dfs,故不访问父节点continue;DFS1(edge[i].to, now);siz[son] += siz[edge[i].to];//以一个节点为根的树(子树)的大小//就是所有以其儿子节点为根的子树的大小之和+1if(siz[son[now]] < siz[edge[i].to])son[now] = edge[i].io;//更新重儿子}
}

第二次DFS

现在还剩下\(top\)数组没有求,第二次DFS的目的便是将其求出

  1. 对于一个节点的重儿子而言
    这个重儿子节点肯定在一条重链上,该链的顶点必定是其祖宗
  2. 对于一个节点的轻儿子而言
    这个轻儿子节点所在重链的顶点便是其本身(即新剖一条链),因为包含其父节点所在重链中其父节点的后继便是其父节点的重儿子,而非轻儿子

为了记录一个节点的重儿子对应的\(top\)值,故必须记录该重儿子所在链的顶点。

void DFS2(int now,int Top)
{
//Top即上文提到的重儿子所在链的顶点,因此now也就是其父节点的重儿子
//或者是以一个节点的轻儿子为顶点的链,now便是该节点,Top也是top[now] = Top;if(son[now])//叶节点没有儿子DFS2(son[now], Top);//继续链接重链elsereturn;//now是叶节点for(int i = head[now]; i; i = edge[i].Next)//处理轻儿子{if(edge[i].to != fa[now] && edge[i].to != son[now])//轻儿子肯定不是父亲,也不是重儿子DFS2(edge.[i].to, edge[i].to);//新剖一条以该轻儿子为顶点的链}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/905598.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

苍穹外卖-day05

redis基本入门 入门略过https://www.bilibili.com/video/BV1TP411v7v6?spm_id_from=333.788.videopod.episodes&vd_source=93f5f50fb9ce34ddae7abba08c6ea064&p=62 50-62级 记了感觉也不会看每次使用redis时需要先启动服务 在redis目录下,进入cmd窗口,输入以下命令启…

2025最新面试题-JVM面试题(二)

堆为什么进行分代设计老年代的担保机制 为什么Eden:S0:S1 是8:1:1 对象的创建以及分配过程方法区与元数据区以及持久代到底是什么关系? Full GC = young GC + Old GC + Meta Space GC 规范:方法区 实现: JDK1.7之前 永久代 持久代 Perm Space 类的总数 常量池大小 方法的…

YashanDB双引号

双引号是对标识符、密码定义和使用的扩展。使用双引号时,标识符、密码定义将支持特殊字符、数字,并且区分字母大小写。 双引号的使用位置(是否可出现在SELECT,FROM和WHERE后)和使用场景规则,以及双引号内字符串的长度限制,由双引号限定的标识符和密码本身决定,与是否加…

YashanDB故障状态

YashanDB检测到异常故障时,防止扩散影响,会将数据库的状态置为ABNORMAL,数据库处于故障只读状态,可以查询,不能执行写的业务。 当数据库为ABNORMAL状态时,可以查看V$DIAG_INCIDENT视图或告警日志明确故障原因。 --故障发生时,数据库状态为ABNORMAL SELECT STATUS FROM V…

YashanDB故障诊断架构

故障诊断架构由多个组件构成,包括自动诊断存储库、运行日志、告警日志等。其中运行日志、告警日志参考日志管理中说明。#自动诊断存储库自动诊断存储库是基于文件的存储库,用于存储数据库的诊断数据。它的目录结构如下(默认放在YASDB_DATA目录下,可设置参数进行配置):其中…

安利一个求职刷题小妙招、变身 offer 收割机 | 《趣玩》第 2 期

通义灵码目前支持的模型已经全面升级,包括 qwen 2.5、qwen 2.5-max,以及通过强化学习优化的增强版推理模型 qwq-plus。作者:王二 在AI技术狂飙突进的今天,程序员如何借力 AI 突破职业瓶颈?阿里云推出的通义灵码插件给出了答案!这款智能编码助手近期完成升级,支持多个业内…

Android开发--Lesson04--对象传递以及文件存储

一.对象传递 使用Intent传递对象的时候需要注意到,被传递的对象必须是实现了Serialzable接口的对象,即被传递的对象必须要是可序列化的public class Student implements Serializable {private String id;private String name;public void setId(String id) {this.id = id;}p…

Ollama使用GPU运行

系统:Win10 GPU :NVIDIA GeForce RTX 2070 with Max-Q Design 禁用GPU 在环境变量中添加 CUDA_VISIBLE_DEVICES 并设为空值。 使用 ollama ps 命令可以看到全部用的CPUCUDA_VISIBLE_DEVICES 是一个环境变量,主要用于控制 NVIDIA CUDA 程序(如基于 CUDA 的应用程序或框架,例…

No.69 Vue---实践--我的网站

一、避坑指南 1.关于路径问题 也不要使用绝对路径 <template><div class="home"><!-- 开始部分 --><div class="signature"><div class="signature-text"><h4 id="hometitle1">在地图上绘制每一次…

Notepad--的安装与使用

Notepad--的安装与使用Notepad--是使用C++编写的轻量级文本编辑器,简称ndd,支持Window/Mac/Linux操作系统平台,还支持国产操作系统如统信Uos、麒麟kinly系统。本文只是概述Notepad--的功能,如果想了解全部的功能可参见官网的ndd说明书 下载与安装 下载地址: https://gitee.…

VirtualBox中的Kylin-Server-10-SP2迁移VMware后开无法进入系统和无网卡的问题记录

问题解决方案来源:https://www.cnblogs.com/flyxuxi/p/15009094.html使用VirtualBox安装Kylin-Server-10-SP2后将磁盘文件使用VMware打开出现无法进入系统和无网卡的问题记录VirtualBox 软件版本:7.1.6 存储 控制器: SATA SATA 端口 1: Kylin-Server-10-SP2-x86-Release-Buil…