您的位置:首页 > 其它

关于树的简单整理

2017-10-27 11:16 162 查看

整理一些树的,基本的,简单的一些知识。

先写一下关于树的许多定义。

树,父节点、子节点、子树、祖先、兄弟、根节点、叶节点、直径、路径、重心、直径、最近公共祖先、生成树、dfs序,树形dp等

 

1、最近公共祖先

一般用倍增求LCA(Least Common Ancestors)。

按照朴素的做法,就是深的点跳到同一高度,然后两个点一齐往上跳。跳到同一位置。

这样其实不慢,一般的树,深度为logn,所以这个复杂度可以是logn。但如果树成了一条链,那么复杂度就是O(n)。

而倍增求LCA,和这个思想是一样的,深的点跳到同一高度,然后两个点一齐往上跳。不过它不是一个点一个点的跳,看下面。

对于任何的数字都可以分解成2的次幂相加的形式(7 = 22+21+20,10 = 23+21...),证明也很简单,任何一个十进制都可以分解成二进制表示。

那么对于跳的任何高度都可以用二进制表示(跳7个,7 = 22+21+20,跳10个10 = 23+21),那么我们预处理出每个点往上跳2的次幂的点,所到达的点是谁就好了。

然后和上面一样跳。

这样明显比上面的快。

贴一下代码 luogu3379

 

void dfs(int u,int fa) {
deth[u] = deth[fa]+1;
q[++tot] = u;
L[u] = tot;
for (int i=head[u]; i; i=e[i].nxt) {
int v = e[i].to;
if (v==fa) continue;
dfs(v,u);
}
R[u] = tot;
}
View Code

 

 

 

总结

这是一篇入门基础级的,没有更多的叙述。(以后再加以补充吧)

树的问题还有很多,这些都是关于基础的一些问题,更多的,感兴趣可以深入的研究;

谢谢观看

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: