dfs序
关于 d f s dfs dfs序是访问一棵树时将其按照 d f s dfs dfs时访问的先后顺序打上序号,一般维护两个数组in和out,用一个id表示时间节点,每次进来一个新的节点则 i n [ u ] = + + i d in[u]=++id in[u]=++id,出去时 o u t [ u ] = i d out[u]=id out[u]=id,当某个结点回溯回来并且没其它结点这个结点的出时间戳一定和最后一个子树的最后一个访问结点的出时间戳一样。于是,通过 O ( n ) O(n) O(n)的扫一遍树上的每个点就可以把非线性的树形结构转成线性的区间结构。
d f s dfs dfs序能够把树上的问题转化为区间问题,用像线段树等维护区间的数据结构来对树上进行询问、更新
图解
Ps:图来源
性质
u结点包含v结点(或称u结点是v结点的祖先)当且仅当v的时间戳介于u的时间戳之间,即 i n [ u ] < i n [ v ] 且 o u t [ u ] > = o u t [ v ] in[u]<in[v]且out[u]>=out[v] in[u]<in[v]且out[u]>=out[v];或者当且仅当v的序列是u序列中连续的一段。
注:seq[in[u]]=u(映射关系)
实现:
int in