首页 > 其他分享 >虚树

虚树

时间:2022-10-11 12:36:10浏览次数:52  
标签:后辈 子树内 LCA 树上 虚树 关键点

在给定树上给出一些关键点,要求构造一棵树,满足所有关键点都在这棵树上,且树的形态与关键点在原树上的形态不变:即本不是祖先/后辈关系的点成为祖先/后辈是不允许的,本来是祖先/后辈的点如果在这棵树上也得是祖先/后辈。

更通俗一点的话,就是把所有关键点找出来,把两两关键点的 LCA 找出来,再根据之前的祖先后辈关系来连边,构成一棵新树。这棵新树就是原树的虚树。

一般可以在虚树上进行 DP,前提是这个 DP 只跟在虚树上的点和其它一些好维护的东西有关,比如两点距离(虚树把一条链的中间缩了,但这条链上的一些信息可以保留在虚树上对应的边上)。

先讲虚树构建方法,然后分析时间复杂度,再讲例题。

给出关键点集合,已知原树,求这个集合构成的虚树。

暴力一点,枚举任意两点及其 LCA,都放到集合里,再去重,再暴力构树。但是这样太暴力了。

朴素一点,把原树 dfs 一遍,一个点如果只有一个子树内有关键点,且自己不是关键点,就被缩,否则就不被缩。这样时间复杂度也不够优秀。

再回到第一个暴力做法,想一下去重后这个集合有多大。结合第二个做法,即最多有多少个节点自身不是关键点,且不只有一个子树内有关键点。

考虑到,每有一个上述说到的不只有一个子树内有关键点,且自身不是管简单的点,就说明至少有 2 个关键点在这个点为根的子树内。反过来——每两个关键点会诞生一个 LCA(或没有),然后这两个关键点没用了,而这个 LCA 会成为新的关键点。最多可以诞生关键点数量 -1 个新点。即——虚树大小跟关键点数量线性相关。

那么可以通过某种方法不重不漏地找出这些点,即可不与原树大小挂钩(虽然预处理需要)。

标签:后辈,子树内,LCA,树上,虚树,关键点
From: https://www.cnblogs.com/0htoAi/p/16778808.html

相关文章

  • 虚树
    前置知识:树的dfs序及其性质参考:洛谷日报定义某棵树\(T\)上存在一个关键点点集\(S\)。如果存在某个点集\(T'\)满足\(S\subseteqT'\subseteqT\),且\(\forallu,......
  • 小学二年级都能看懂的 虚树学习笔记
    过不去那道题?事实:它数据范围很大而且每一次询问都得O(n)暴力出题人最坏了!介绍……虚树!介绍先看这么一道题P2495[SDOI2011]消耗战题目大意:每一次给k个特殊点,每次......
  • 虚树
    虚树是一种神奇的算法,它的具体思想为在一棵较为庞大的树当中,我们可能并不需要考虑该树上的所有节点,而是只需要考虑其中的一部分的话,我们可以使用这些点组建一棵虚树。虚树......
  • 虚树
    一种大树变小树的方法。大概就是只保留题目要求的关键点和其他一些统计答案必须的点,把剩余的所有点从树上砍掉。原理是维护一条最右链(就是我们扫到的最右边的一条链,它左边......
  • dfs序 括号序 欧拉序 树上莫队 虚树建立 傻傻分不清
    括号序进加一次,出加一次,显然最后得到的序列只有\(2n\)个点。voiddfs(intx){ in[x]=++tot; for(y)dfs(y); out[x]=++tot;}显然我们希求将树上路径表示为区......