树的序列化——浅谈 dfn 与欧拉序列

d f n dfn dfn 序列

  1. 定义:dfn[u] 表示 u 在 dfs 时第几个访问到。例如 dfs 序列为 1423, 则 dfn 序列为 1342。
  2. 特点:
    • 祖先总在子孙前
    • 子树总是连续段:以 u 为根的子树为区间 [ d f n u , d f n u + s z u − 1 ] [dfn_u,dfn_u+sz_u-1] [dfnu,dfnu+szu1]
    • 不能直接复原出树的结构,但借助 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 
}
  1. 应用:判断 u u u 是否为 v v v 的严格直系祖先: v ∈ u v\in u vu &&
  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值