树的dfs序相关的东西

1.dfn序
2.欧拉序1

void dfs(int u,int f){
	a[++dfk]=u;
	for(int i=head[u];i;i=nxt[i])
	   if(v[i]!=f){
	   	    dfs(v[i],u);
	   	    a[++dfk]=u;
	   }
}

rmq求s,t的lca的时候,求它们中in之间的深度最小的点就行了

3.欧拉序2

void dfs(int u,int f){
	a[++dfk]=u;
	for(int i=head[u];i;i=nxt[i])
	   if(v[i]!=f){
	   	    dfs(v[i],u);
	   }
	  a[++dfk]=u;
}

于是每个点会有一个st和ed
若lca(x,y)=x
那么st[x]到st[y]这段区间中,有的点出现了两次,有的点没有出现过,这些点都是对答案没有贡献的,我们只需要统计出现过1次的点就好
若lca(x,y)≠x,此时x,y位于不同的子树内,我们只需要按照上面的方法统计ed[x]到st[y]这段区间内的点。加上特判LCA

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值