DFS序列(dfn)
在没有或存在一定限制条件的情况下,以DFS遍历经过的节点顺序构成的序列。记dfn(x)为第一次访问该节点的时间戳,seq(t)为访问序为t的节点。
容易发现,节点x的子树节点的dfn一定是一段连续的区间。故我们可以使用数据结构方便地维护子树的信息。
欧拉序
和DFS序不同,欧拉序在每个节点开始/结束访问时均会被记录一次,故该序列的长度为2n,n为节点数。例如,对于下面这棵树,一个合法的欧拉序是0,2,3,3,4,1,1,4,2,0。
记序列为seq,每个节点开始访问的时间戳为st(x),结束访问的时间戳为ed(x),有seq(st(x))=seq(ed(x))=x。则st(4)=5,ed(4)=8。
欧拉序可以处理路径上的问题。考虑x↔y的简单路径,它可以被看做欧拉序上连续的一段。我们取序列中的这些元素:
seq(t),t∈{[st(x),st(y)],[ed(x),st(y)],当x和y存在“祖先 – 儿子”关系,且设x是y的父亲其他情况,并令st(x)<st(y)
若同一个节点在该区间中出现了2次,说明在x↔y的简单路径上不存在该节点,不统计其信息,否则作统计。还需要注意,当x,y互不为祖先时,其lca不会出现在子区间中(参看欧拉序的定义),需要额外统计。
它往往与根号分治、分块、莫队等算法有机结合,处理树上路径的询问。[WC2013] 糖果公园是其经典应用。
点击小标题出门右转OI Wiki。