简述求LCA的倍增算法

  对于树上的所有节点,我们可以很轻松地通过dfs求出其直接的父亲节点以及其深度

  通过类似RMQ的原理我们可以处理出每个节点的第2^i个父亲

  //这个过程既可以在dfs之后双重循环建也可以像树剖模板里那样dfs里直接建

  //个人比较推荐后者,会少掉一些不必要的运算,但由于log算法的优越性使得它们实际差别不大

  如图u,v为题目中给的两个节点,我们要做的第一步是将u,v调整到同一深度

  做法很简单,只需要用2^i从大到小逼近答案

  调整到同一深度以后两个节点共同前进,做法和上面调整深度时一样

  细节:

    当u,v的深度刚开始就相同时一定要特判,因为运算到ln(0)会出错


BZOJ1602 简单的LCA模板题

BZOJ1787 题目大意是让我们求出树上三个点到同一点的边权加和最小,输出那个点和最小边权


  我们通过上面的例子可以发现,并不是三点的LCA就是边权和最小的

  因为图上的红边如果走到红色节点的时候会走两次,而走到绿色节点时只走一次,其他路径上的节点各一次

  发现其实和树的重心有点关系...然后就想到了暴力滚粗的ZJOI Day1T1

  其实这道题没那么麻烦...因为只有三个点,很容易想到最终的答案一定是其中两个点的LCA

  那么枚举三次就可以了,先将其中两个点做一次LCA,求出路径边权和,再将这个新求出的点和剩下的点做LCA,求路径和

  第一问的答案就是第一次LCA后求出的那个点

BZOJ2144

  几乎看不出来和LCA有什么关系的题...

  但是想出来了之后觉得这个思路简直太好了...

  对于一个状态我们用三元组表示(x,y,z)

  一种转移是从外面的点跳向中间,而显然由于题目中“只能跳过一颗棋子”的限制所以只有一种方法

  而从中间的点跳向两边就有两种方式

  按照以前的思路,这里就直接BFS敲起来了..

  我们考虑每一个三元组不停地向中间跳一定有一个最终状态

  而这个最终状态向外跳又能产生一系列形如二叉树的状态

  我们将向外跳定义为向儿子状态的连边,向上条定义为向父亲节点的连边

  两个状态的树上路径长度正好的题目中要求的内容

  而第一问只需判断根节点的状态是否一样就可以了

  但对于10^9的数据,想到这里显然还不够

  我们面临着两个问题,一个是depth怎么求(数组根本开不下状态也枚举不完),第二个是第2^i个父亲怎么求

  我们发现这两个问题是有联系的

  考虑一个状态(x,y,z),设t1=y-x,t2=z-y

  当t1>t2时,显然是右边的z往左跳,但是可以跳几步呢?我们解不等式即可得出:(t1-1)div t2步

  当t2>t1时同理

  每次更新t1,t2我们发现它实际上是一个辗转相除的过程,也就是没有几步就可以到达根节点

  也可以根据这个过程叠加出深度

  也可以根据这个过程,算出已知状态的第2^i个父亲状态

  这样一来,这个问题就差不多解决了

  最后一个细节,读进来的状态是无序的,要排序后再做/w\

[BZOJ1602&BZOJ1787&BZOJ2144]树上LCA的算法巩固练习的更多相关文章

  1. 最近公共祖先LCA(Tarjan算法)的思考和算法实现

    LCA 最近公共祖先 Tarjan(离线)算法的基本思路及其算法实现 小广告:METO CODE 安溪一中信息学在线评测系统(OJ) //由于这是第一篇博客..有点瑕疵...比如我把false写成了f ...

  2. LCA:Tarjan算法实现

    本博文转自http://www.cnblogs.com/JVxie/p/4854719.html,转载请注明出处 首先是最近公共祖先的概念(什么是最近公共祖先?): 在一棵没有环的树上,每个节点肯定有 ...

  3. 最近公共祖先LCA(Tarjan算法)的思考和算法实现——转载自Vendetta Blogs

    LCA 最近公共祖先 Tarjan(离线)算法的基本思路及其算法实现 小广告:METO CODE 安溪一中信息学在线评测系统(OJ) //由于这是第一篇博客..有点瑕疵...比如我把false写成了f ...

  4. LCA倍增算法

    LCA 算法是一个技巧性很强的算法. 十分感谢月老提供的模板. 这里我实现LCA是通过倍增,其实就是二进制优化. 任何一个数都可以有2的阶数实现 例如16可以由1 2 4 8组合得到 5可以由1 2 ...

  5. 牛客网 桂林电子科技大学第三届ACM程序设计竞赛 D.寻找-树上LCA(树上a到b的路径上离c最近的点)

    链接:https://ac.nowcoder.com/acm/contest/558/D来源:牛客网 寻找 小猫在研究树. 小猫在研究树上的距离. 给定一棵N个点的树,每条边边权为1. Q次询问,每次 ...

  6. POJ 1330 Nearest Common Ancestors (LCA,倍增算法,在线算法)

    /* *********************************************** Author :kuangbin Created Time :2013-9-5 9:45:17 F ...

  7. Tarjan的LCA离线算法

    LCA(Least Common Ancestors)是指树结构中两个结点的最低的公共祖先.而LCA算法则是用于求两个结点的LCA.当只需要求一对结点的LCA时,我们很容易可以利用递归算法在O(n)的 ...

  8. 最近公共祖先 LCA 倍增算法

          树上倍增求LCA LCA指的是最近公共祖先(Least Common Ancestors),如下图所示: 4和5的LCA就是2 那怎么求呢?最粗暴的方法就是先dfs一次,处理出每个点的深度 ...

  9. hdu-3078 Network(lca+st算法+dfs)

    题目链接: Network Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Others) P ...

随机推荐

  1. html5判断设备的动作

    相应的事件 deviceorientation事件提供设备的物理方向信息,表示为一系列本地坐标系的旋角. devicemotion事件提供设备的加速信息,表示为定义在设备上的坐标系中的卡尔迪坐标.其还 ...

  2. ACE学习综述(1)

    1. ACE学习综述 1.1. ACE项目的优点 可以跨平台使用,基本上可以实现一次编写,多平台运行. ACE本身不仅仅是一个简单的网络框架,对于网络框架涉及到的进程管理.线程管理等系统本身相关的内容 ...

  3. Qt Qwdget 汽车仪表知识点拆解7 图像绘制,旋转

    先贴上效果图,注意,没有写逻辑,都是乱动的 看下最中心的指针旋转,这里使用的QPainter的绘制函数 要显示复杂的效果,需要分层 void Widget::draw_number_pointer() ...

  4. 常用模块(xml)

    XML(可扩展性标记语言)是一种非常常用的文件类型,主要用于存储和传输数据.在编程中,对XML的操作也非常常见. 本文根据python库文档中的xml.etree.ElementTree类来进行介绍X ...

  5. xadmin站点管理面样样式控制

    xadmin可以使用的页面样式控制基本与Django原生的admin一直. list_display 控制列表展示的字段 search_fields 控制可以通过搜索框搜索的字段名称,xadmin使用 ...

  6. hdu 1556 Color the ball (区间更新 求某点值)

    Problem Description N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a ...

  7. 并查集——poj1182(带权并查集高阶)

    题目链接:食物链 题解:点击 说一声:这题关系推导值得学习.

  8. WebStorm中配置ExtJS

    原文链接:http://zhidao.baidu.com/link?url=yX0wDWrL-b2P8k3JNNI38Fb6keuAgm0j9E-QBL1KfWXrZgLZ88grAOVJvat6dJ ...

  9. WCF身份验证三:自定义身份验证之<MessageHeader>

    关于使用SoadHeader验证Robin已经有一篇十分精彩的文章: WCF进阶:为每个操作附加身份信息, 不过我的思维方式总是跟别人有点不太一样, 还是把类似的内容用我的方式重新组织一下. 使用He ...

  10. Spring Data JPA 简单查询

    一.常用规则速查 1  And 并且2  Or  或3  Is,Equals 等于4  Between  两者之间5  LessThan 小于6  LessThanEqual   小于等于7  Gre ...