虚树

概述

在处理某些树上问题时,并非树上的所有节点都起作用;这时可以借助虚树,将树上重要的点构造成一棵树,在虚树上处理问题,优化时间复杂度。

模板

用栈来维护虚树上的一条从根到 $u$ 的链。如果 $u$ 是栈顶节点的儿子,则入栈;否则将栈中 dfn 值大于 $\text{lca}(u,s.top())$ 的元素出栈。

伪代码
1
2
3
4
5
6
7
8
9
10
11
将树上所有关键点按照 dfs 序排序
stack.push(1)
for u = 1 ~ n: //假设当前正在处理节点 u
lca = Lca(u, stack.top())
while stack.top() != lca:
tmp = stack.top()
stack.pop()
if (dfn[stack.top()] < dfn[lca]):
stack.push(lca)
AddEdge(stack.top(), tmp)
stack.push(u)
# 虚树

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×