初学dfs序

【定义】

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;
}

【应用】

待续

 

猜你喜欢

转载自blog.csdn.net/sdz20172133/article/details/81669703
今日推荐