长链剖分(Long Chain Decomposition)算法详解
📅 2026/7/26 23:59:07
👁️ 次浏览
1. 什么是长链剖分长链剖分Long Chain Decomposition是一种针对有根树的链剖分方法常用于解决树上与深度、距离相关的静态查询问题。与重链剖分Heavy-Light Decomposition不同长链剖分优先选择子树中最深的儿子作为“长儿子”从而将树分解为若干条“长链”。长链剖分的核心思想是对于每个节点选择其子树深度最大的儿子作为“长儿子”然后将该节点与其长儿子连接成同一条链。这样整棵树就被分解为若干条从某个节点开始一直沿着长儿子向下延伸的链这些链被称为“长链”。2. 长链剖分的构建长链剖分的构建可以通过一次深度优先搜索DFS完成时间复杂度为 O(n)。算法步骤第一次 DFS计算每个节点的深度depth和子树最大深度max_depth。第二次 DFS为每个节点确定“长儿子”即子树最大深度最大的儿子。从根节点开始将每个节点与其长儿子连接形成长链。3. 代码实现C#include bits/stdc.h using namespace std; const int N 1e5 5; vectorint g[N]; // 邻接表存树 int depth[N], max_depth[N]; // 深度、子树最大深度 int son[N]; // 长儿子 int top[N]; // 所在长链的顶端节点 // 第一次 DFS计算深度和子树最大深度 void dfs1(int u, int fa) { depth[u] depth[fa] 1; max_depth[u] depth[u]; for (int v : g[u]) { if (v fa) continue; dfs1(v, u); max_depth[u] max(max_depth[u], max_depth[v]); if (max_depth[v] max_depth[son[u]]) { son[u] v; // 更新长儿子 } } } // 第二次 DFS构建长链 void dfs2(int u, int fa, int tp) { top[u] tp; if (son[u]) { dfs2(son[u], u, tp); // 长儿子继承当前链 } for (int v : g[u]) { if (v fa || v son[u]) continue; dfs2(v, u, v); // 其他儿子作为新链的顶端 } } int main() { int n; // 节点数 cin n; for (int i 1; i n; i) { int u, v; cin u v; g[u].push_back(v); g[v].push_back(u); } dfs1(1, 0); dfs2(1, 0, 1); // 输出每个节点所在长链的顶端 for (int i 1; i n; i) { cout 节点 i 所在长链顶端: top[i] endl; } return 0; }4. 长链剖分的性质与应用4.1 主要性质链长性质每条长链的长度等于链顶端节点的子树最大深度减去该节点的深度。链数上界长链的数量不超过 O(√n)实际应用中通常远小于这个上界。深度性质任意节点到其所在长链顶端的距离不超过该节点子树的最大深度。4.2 典型应用树上 k 级祖先查询预处理 O(n log n)查询 O(1)。树上两点距离查询结合 LCA可以快速计算任意两点距离。子树深度相关统计如子树中深度为 d 的节点数量。优化树上 DP通过指针继承技巧将某些树形 DP 的复杂度从 O(n²) 降为 O(n)。5. 长链剖分 vs 重链剖分对比维度长链剖分重链剖分选择标准子树深度最大的儿子子树大小最大的儿子链长特点链较长数量较少链较短数量较多主要应用深度、距离相关查询路径修改、子树查询复杂度通常 O(n)O(n log n)代码难度相对简单相对复杂6. 实战例题6.1 例题树上 k 级祖先问题描述给定一棵 n 个节点的有根树有 q 次查询每次查询给出节点 u 和整数 k求 u 的第 k 级祖先如果不存在则输出 -1。数据范围n, q ≤ 10⁵。长链剖分解法思路预处理每个节点的 2^i 级祖先倍增。对每条长链预处理从链顶向上/向下走链长步的所有节点。查询时先利用倍增跳到 2^h 级祖先使得剩余步数小于链长然后通过预处理的链信息 O(1) 得到答案。7. 总结长链剖分是一种高效的树上问题处理技巧特别适合解决与深度、距离相关的静态查询问题。通过优先选择深度最大的儿子将树分解为较少的长链从而在预处理和查询时获得优异的时间复杂度。掌握长链剖分需要理解其构建过程、核心性质以及指针继承等优化技巧。建议通过实际编码练习来加深理解特别是树上 k 级祖先、深度统计等经典问题。
1. 什么是树链剖分?树链剖分(Tree Chain Partition,简称树剖)是一种将树形结构转化为线性序列的算法技巧。它通过将树上的路径分解为若干条“重链”,使得原本在树上难以高效处理的路径查询、路径修改等问题,…
📅 2026/7/26 23:59:07
企业 Agent 技术正在经历从受控部署到软件工厂模式的重大转型。在这个过程中,产品意图作为自驱系统的第三道边界,正在重新定义企业级 AI 代理的开发范式和应用场景。 这次我们重点分析企业 Agent 如何从传统的受控部署演进到软件工厂模式,以…
📅 2026/7/26 23:58:06
每日安全情报报告 由 AI 整理发布 一、最新高危漏洞(近 48 小时)
1. CVE-2026-66012:SiYuan MCP 接口缺失授权,任意用户可接管管理员权限
风险等级:🔴 严重CVE 编号:CVE-2026-66012漏洞类型&a…
📅 2026/7/26 23:58:06
七月评测体系建设复盘:从零到可重复评测流水线的搭建之路
一、评测不是跑分,是建立信任
一个模型上线前经过了"充分评测":MMLU 得分 72.3,C-Eval 得分 68.1,人工评估 10 个 case 全部通过。上线后第三个小时…
📅 2026/7/27 2:24:58
1. 项目概述:为什么我们需要量化RTOS的开销?在嵌入式系统,尤其是数字信号处理(DSP)应用里,我们常常面临一个核心矛盾:一方面,复杂的应用逻辑催生了使用实时操作系统(RTOS…
📅 2026/7/27 2:24:58
PyTorch 七月踩坑合集:从 DataLoader 死锁到 CUDA 同步
一、PyTorch 的坑,总是在你最忙的时候出现
七月的一个多卡训练任务,跑了 12 小时后 DataLoader 死锁。8 张 A100 全部闲置,进程还活着但不再输出任何日志。GDB attach 上去发…
📅 2026/7/27 2:24:58
1. 项目概述:为什么选择VRoid Studio开启你的3D角色创作之旅?如果你对创造一个独一无二的3D虚拟形象充满兴趣,但又觉得Blender、Maya这些专业软件门槛太高,那么VRoid Studio几乎是为“零基础”的你量身定制的入场券。我最初接触它…
📅 2026/7/27 2:24:58
1. 项目概述:为什么Unity分屏开发值得你投入精力?在游戏开发、模拟训练、数据可视化乃至数字孪生等众多领域,分屏显示早已不是一项“锦上添花”的功能,而是解决核心交互与展示需求的刚需。想象一下,一个本地多人游戏需…
📅 2026/7/27 2:24:58
1. 项目概述在嵌入式开发领域,尤其是基于ARM Cortex-M内核的微控制器项目中,直接操作硬件寄存器是基本功,但TI的Tiva C系列(如TM4C123x)提供了一个更优雅的解决方案:固化在芯片ROM中的驱动库(RO…
📅 2026/7/27 2:23:58
现象在 WezTerm 终端中,包含中文路径的文本(如标签页标题、Shell 提示符、路径补全)中,某些汉字时而渲染为日文字形,时而显示为简体中文(中国大陆)字形。以「径」字为例,日文写法右侧…
📅 2026/7/27 0:00:07
这个问题看似在寻找一个答案,实际上是在寻找一种“值得继续投入的方向感”。很多人在问:
“人生有什么意义?”
深层可能是在问:
我现在做的事情值得吗?我的努力有没有价值?我的存在是不是重要?未…
📅 2026/7/27 0:00:07
1. 为什么MoE架构让大模型参数量翻倍却不增加推理成本?去年我在部署一个千亿参数大语言模型时,首次接触到混合专家模型(Mixture of Experts,简称MoE)架构。当时最让我震惊的是,这种架构的模型参数量可以达到…
📅 2026/7/27 0:00:07
更多请点击:
https://codechina.net
第一章:AI帮助理解数学概念 人工智能正以前所未有的方式重塑数学学习的路径。通过自然语言处理与符号计算的深度融合,AI不仅能解析抽象定义,还能将定理、证明和几何直觉转化为可交互、可验证的…
📅 2026/7/27 1:11:21
1. 项目背景与核心价值去年参与的一个短剧项目让我深刻体会到传统创作流程的痛点:编剧团队花了三周打磨剧本,角色设计反复修改了七版,最后成片时又因为演员档期问题不得不临时调整分镜。这种低效的创作模式在快节奏的内容行业越来越难以为继。…
📅 2026/7/27 1:11:21
remix-i18next TypeScript类型安全实践:确保翻译键与类型定义同步 【免费下载链接】remix-i18next The easiest way to translate your React Router framework mode apps 项目地址: https://gitcode.com/gh_mirrors/re/remix-i18next
在开发多语言应用时&am…
📅 2026/7/27 1:11:21
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/26 7:10:22
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/26 17:10:53
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/26 5:10:17