d f n dfn dfn 序列
- 定义:dfn[u] 表示 u 在 dfs 时第几个访问到。例如 dfs 序列为 1423, 则 dfn 序列为 1342。
- 特点:
- 祖先总在子孙前
- 子树总是连续段:以 u 为根的子树为区间 [ d f n u , d f n u + s z u − 1 ] [dfn_u,dfn_u+sz_u-1] [dfnu,dfnu+szu−1]。
- 不能直接复原出树的结构,但借助 s z u sz_u szu 可以复原。
struct subTree{
int L,R;}T[maxn];//子树区间
int dfn[maxn],timer;//dfn 序列与时间戳
vector<int> e[maxn];//模拟邻接表
inline void dfs(int u,int fa){
T[u].L=dfn[u]=++timer;
for(int i=0;i<e[u].size();i++){
int v=e[u][i];
if(v!=fa) dfs(v,u);
}
T[u].R=timer;//dfn[u]+sz[u]-1, 因此不用 ++timer
}
- 应用:判断 u u u 是否为 v v v 的严格直系祖先: v ∈ u v\in u v∈u &&