【定义】
dfs序是指:每个节点在dfs深度优先遍历中的进出栈的时间序列。
这张图的dfs序显然为A-B-D-E-G-C-F-H
【重要性质】
dfs序可以把一棵树区间化,即可以求出每个节点的管辖区间。
对于一棵树的dfs序而言,同一棵子树所对应的一定是dfs序中连续的一段。
这个性质非常重要,在利用dfs序来解题的过程中,这个不可缺少!
证明: 在dfs遍历时,当进入一个节点之后,dfs会先把当前的节点的所有子节点都遍历一遍,然后在回溯到当前节点,在这个过程中,它的所有子孙节点一定都被访问过了,而且在这之前,它的任何一个子孙节点都不可能被访问过。然后它才离开当前子树,回到父亲节点,再访问其他子树,所以同一子树的节点在dfs序中一定是连续的一段。
【代码模板】
void dfs(int x,int pre,int d){//L,R表示一个子树的范围
L[x]=++tot;
dep[x]=d;
for(int i=0;i<e[x].size();i++){
int y=e[x][i];
if(y==pre)continue;
dfs(y,x,d+1);
}
R[x]=tot;
}
【应用】
待续