dfs序是将树形结构转换为线性结构的一种方式。
dfs序
dfs序: 指每个节点在dfs深度优先遍历中的进出栈的时间序列。
定义三个数组:
in[x]:表示结点x 入栈的时间戳。
out[x]:表示结点x出栈的时间戳,特殊的,出栈不算时间。
id[x]:表示结点x在新的线性序列中的下标, id[x]=in[x]。
dfs访问顺序为:A,B,E,F,K,C,G,H,I
则结点的入栈出栈时间如下:
这样,我们得到一个新的线性序列:
A,B,E,F,K,C,G,H,I
通过观察可以发现,以x 为根的子树在一个连续的区间,即在x 入栈和出栈之间,因此,如果要对子树进行操作,可以看作对一个区间进行操作,且这个区间对应新的线性序列中的in[x] out[x]。
支持两种操作:
单个结点修改
对单个结点x进行修改,则对应新的线性序列对id[x]进行修改。
对x为根的子树进行修改
如对结点B根的子树进行操作,则对应线性序列区间in[B] out[B],即区间[2,5]进行操作。
void dfs(int u)
{
inn[u]=++num; //入栈时间
s[u]=num; //新的线性序列
vis[u]=1;
for(int i=first[u];i!=-1;i=nex[i])
{
int v=to[i];
if(!vis[v]) dfs(v);
}
outt[u]=num; //出栈时间,不计算时间
}