尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

(简记)虚树

(简记)虚树
📅 发布时间:2026/6/18 19:31:01

该结构是用来处理一类关键点问题的。

具体地,我们压缩树的信息,每次需要选出 \(k\) 个点 \(h_1,h_2,\dots,h_k\),它们在树上两两路径是重要信息。我们一般会在一个路径的拐点即 \(u\to v\) 的 \(\text{LCA}(u,v)\) 上处理这条路径,那么我们不妨令虚树包含 \(h_i\) 及所有 \(\text{LCA}_{i<j}(h_i,h_j)\),然后树上 DP 或者 DFS 什么的就可以解决问题。

建树

方法 1

所有关键点按 DFS 序升序排序,排序后任意两个相邻点求 \(\text{LCA}\) 并加入关键点序列然后再次排序并去重,最后在序列上枚举任意两个相邻点 \(x,y\) 并连接 \(\text{LCA}(x,y)\to y\) 即可。

这样的做法直观理解是容易的。首先有结论,加入的那一堆点后序列中包含虚树中所有点,证明是容易的,这个结论 NOIP 2024 T4 也有用到。

Proof

假设有任意一个 \(\text{LCA}(h_i,h_j)\) 没有被加入序列中,如果这个 \(\text{LCA}\) 与 \(h_i\) 或 \(h_j\) 任意其一相等那么它肯定在序列中,否则考虑 \(h_i,h_j\) DFS 序排序后中间有没有点。如果没有,根据上述方法会加入序列。如果有且有的在 \(h_i\) 的子树中(\(A\) 集合,为了全面性包括 \(h_i\)),有的挂在 \(\text{LCA}\to h_j\) 的链上(\(B\) 集合,同样包括 \(h_j\)),那么 \(A\) 和 \(B\) 一定会有一个 DFS 序排序后相邻的点贡献给 \(\text{LCA}\)。

我们按照 DFS 序排序,那么连边的过程类似于进行搜索,考虑 \(x\) 在排列中上一个相邻节点,如果其在祖先链上那么肯定就是它在虚树上的直接父亲 \(fa\),否则一定是 \(fa\) 在搜索过程中在另一个子树中的最后一个节点,其 \(\text{LCA}\) 必定是 \(fa\)。

代码请前往 OI-wiki。

方法 2

我们先所有关键点按 DFS 序升序排序,然后顺序遍历模拟原树上 DFS 过程,用单调栈记录当前链上的虚树上的点有哪些,所有虚树上边在节点出栈时连接。每次加入节点 \(u\) 时令 \(lc=\text{LCA}(u,stack_{top})\),弹出栈顶直到栈顶的下一个元素的 DFS 序 \(<dfn_{lc}\),然后如果此时栈顶就是 \(lc\),直接加入即可。否则把 \(lc\) 插入到栈中两个 DFS 序相邻的位置,然后继续弹出后面那个东西。最后如果栈顶不是 \(u\) 把 \(u\) 入栈即可。

for(int i=1;i<=k;i++)cin>>h[i],tg[h[i]]=now,head[h[i]]=0;
sort(h+1,h+1+k,cmp);
stk[++tp]=1;head[1]=0;
for(int i=1;i<=k;i++){int lc=LCA(stk[tp],h[i]);while(dfn[lc]<dfn[stk[tp]]){if(tp>1){if(dfn[stk[tp-1]]<dfn[lc]){stk[tp+1]=stk[tp];head[lc]=0;stk[tp]=lc;tp++;}ins(stk[tp-1],stk[tp],dis(stk[tp-1],stk[tp]));}tp--;}if(stk[tp]!=h[i])stk[++tp]=h[i];
}
while(tp>1)ins(stk[tp-1],stk[tp],dis(stk[tp-1],stk[tp])),tp--;

相关新闻

  • AI测试平台自动遍历:低代码也能玩转全链路测试
  • Cesium Shader内置变量 czm_*
  • IDA Pro 9.2 发布 - 强大的反汇编程序、反编译器和多功能调试器

最新新闻

  • PyCaret低代码实现房价预测:从数据准备到模型上线全链路
  • 【Springboot毕设全套源码+文档】基于springboot的智慧仓库(丰富项目+远程调试+讲解+定制)
  • 2026年6月PE排水管企业推荐指南 - 多才菠萝
  • 全维度测评报告:2026 杭州黄金回收报价套路拆解,称重、验金、扣费猫腻逐项核验 - 奢侈品回收评测
  • DSP56800到DSP56800E代码移植:AGU寄存器加载策略与兼容性问题详解
  • Python自动化测试实战:从Selenium到Pytest的完整技术栈解析

日新闻

  • 2026年不锈钢卷板厂家推荐排行榜:冷轧热轧/304/201不锈钢卷板,高颜值耐腐蚀源头厂家实力精选 - 企业推荐官【官方】
  • FLUX.1-dev FP8模型实战指南:24GB以下显卡高效部署方案
  • 2026佛山长途搬家价目表:跨省跨市搬家费用完整计算指南 - 从来都是英雄出少年

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号