博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LCA
阅读量:6838 次
发布时间:2019-06-26

本文共 694 字,大约阅读时间需要 2 分钟。

推荐博客 : http://blog.csdn.net/lw277232240/article/details/72870644

 

LCA 就是去寻找最近公共祖先 ,如上图中 10 与 11 的LCA是 6 ,7 和 12 的LCA 是 4 。

通过这个我们可以解决的一类问题就是 求任意两点之间的距离。

对于这个问题,我们首先最暴力的可以写出一个深搜,复杂度是 O(n),对于多次查询的话肯定会超时。

在看上图,比如让求 10 和 11 的距离,首先我们可以将他们放置同一层,然后向上一步一步的移动。当他们的父亲相同时,那么就结束移动过程。这样的操作最复杂的情况也是 O(n)的,那要怎么去优化呢?可以采用二进制的思想,每次向上去跳动,这里的二进制思想和完全背包的很像。

在这里会用到两个数组 grand[x][i], 表示 点 x 向上移动 2 ^ i 。那么会得到的关系式是 grand[x][i] = grand[grand[x][i-1]][i-1], 这是成立的,因为 2^4 等于 2^3 + 2^3 。

gw[x][i] 数组,表示的是点 x 向上移动 2^i 后的距离是多少,gw[x][i] = gw[x][i-1] + gw[grand[x][i-1]][i-1] 。

如果一直按照这种思路我们可以去求得很多的量,比如去求 两个点之间线段的最大长度, maxx[x][i] = max(maxx[x][i-1], maxx[grand[x][i-1]][i-1] )

转载于:https://www.cnblogs.com/ccut-ry/p/8424714.html

你可能感兴趣的文章
[PHP] csv to xml
查看>>
Xfire实现webservice时,对象传递规则及解析简析
查看>>
设计模式——备忘录模式
查看>>
Oracle 常用性能监控SQL语句
查看>>
CentOS 启动提示unexpected inconsistency;RUN fsck MANUALLY
查看>>
red5安装时候出现服务不能启动异常
查看>>
查找目录下的所有文件中是否含有某个字符串
查看>>
段错误以及调试方式
查看>>
javascript中的时间处理
查看>>
JS正则截取两个字符串之间的字符串
查看>>
从零开始学习OpenCL开发(三)深入API
查看>>
新时期读书的价值
查看>>
hdoj 1226 超级password 【隐图BFS】
查看>>
10年工作经验老程序员推荐的7个开发类工具
查看>>
C# sqlserver 2008 连接字符串
查看>>
相关列的基数计算
查看>>
Java阅读word程序说明文件
查看>>
JSpider是一个用Java实现的WebSpider
查看>>
cocos2dx-3.0(13)------SpriteBatchNode与SpriteFrameCache渲染速度
查看>>
oracle备份和升级数据库
查看>>