1.什么时候用dfs序:
树的dfs序就是用来维护一系列树上的问题的,这类问题主要是解决一棵树上的所有后代结点信息的更改和祖先结点有关,主要先通过dfs来记录一个树的每一个顶点的出入时间戳,来控制它子树上的所有结点的状态的更新。用L[],R[]来记录这个祖先结点控制后代结点的区间。
即dfs序的特点就是:一棵子树的dfs序就变成了一个区间;
2.dfs序的作用:
*相当于把树上的问题转化成了序列上的问题
*辅以各种数据结构(ST表、树状数组、线段树)进行运算
*子树求和->区间求和
3.dfs序详解
4.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;
}
建议用代码模拟过程一波;5.例题:poj3321 Apple Tree
链接:点击打开链接
/****参考资料:****/
*http://www.cnblogs.com/bytebull/p/5929137.html(给定一颗树, 和每个节点的权值.下面有7个经典的关于dfs序的问题);
*https://acm.sjtu.edu.cn/w/images/3/35/%E6%A0%91%E7%9A%84dfs%E5%BA%8F%E5%8F%8A%E5%85%B6%E5%BA%94%E7%94%A8%EF%BC%88%E9%97%AB%E9%B8%BF%E5%AE%87%EF%BC%89.pdf
*http://www.dbwater.net/2016/08/26/dfsx/(codeforces C题)
*http://www.voidcn.com/blog/qq_24489717/article/p-5001355.html