#include <iostream>
#include <vector>
#include <algorithm>
#define MAXN 100
//2^MAXLOG2>=最大深度
#define MAXLOG2 7
using namespace std; vector<int>G[MAXN];
int depth[MAXN];
int ancestor[MAXN][MAXLOG2]; void creat()//输入并存储树
{
int n,x,y;
cin>>n;//n条边
for(int i=;i<n;i++)
{
cin>>x>>y;
G[x].push_back(y);
G[y].push_back(x);
}
}
void dfs(int x,int father)
{
depth[x]=depth[father]+;//计算x深度
ancestor[x][]=father;
//计算x结点的2^i步祖先
for(int i=;i<MAXLOG2;i++)
//因为是dfs,所以深度小的结点的ancestor总会先算出来
//MAXLOG2太大了会怎样?因为ancestor[0][i]=0,所以不管怎样往上走都是0
ancestor[x][i]=ancestor[ancestor[x][i-]][i-];
for(int i=;i<G[x].size();i++)
if(G[x][i]!=father)dfs(G[x][i],x);
}
int lca(int x,int y)
{
if(depth[x]<depth[y])swap(x,y);
/*假设x与y深度相差z,x每次走2^i(i从最大每次循环减少1)步总能到达y的深度
证明:将z转换成二进制,再转换成十进制
则肯定等于2^i1 + 2^i2 + 2^i3 ... 形式 */
for(int i=MAXLOG2-;i>=;i--)
//如何防止走多了?走完后的深度比y还小,说明走多了,这时候我们就不走
if(depth[ancestor[x][i]]>=depth[y])x=ancestor[x][i];
if(x==y)return x;
//假设x与LCA相距L步,那么x,y都走L-1步仍然不相等,下面的循环是让x,y走L-1步
for(int i=MAXLOG2-;i>=;i--)
/*如何防止走多了?
注意循环结束条件,并非当x,y走完后相等
如果以x,y相等为结束条件,则有可能会走过了
此循环的目的是为了让x,y走L-1步
LCA相当于x,y的中点
为什么一定刚好走L-1步?
首先能确定的是存在两个结点再往上一步就是LCA
此循环让x,y只要不相等就往上走,x,y肯定会到达这两个结点
即x,y走L-1步会到达那两个结点。自己可以画图试试*/
if(ancestor[x][i]!=ancestor[y][i])
{
x=ancestor[x][i];
y=ancestor[y][i];
}
return ancestor[x][]; //即x再向上走1(2^0)步即是LCA
}
int main()
{
creat();//数据要输入
dfs(,);
//cout<<lca(7,6);
return ;
}

最新文章

  1. optparse
  2. 给inpu加背景图,input内容又不能盖着背景图
  3. &lt;table&gt;标签隐藏内边框与外边框
  4. 驱动开发学习笔记. 0.06 嵌入式linux视频开发之预备知识
  5. 使用json格式输出
  6. mysql TIMESTAMP 报错
  7. [收藏夹整理]OpenCV部分
  8. mysql日志详细解析 [转]
  9. svn解决冲突 Aborting commit: &#39;XXXXXXXX&#39;remains in conflict错误
  10. WebApi2官网学习记录---异常处理
  11. Head First 设计模式目录
  12. springMVC(4)---生成excel文件并导出
  13. BZOJ_1598_[Usaco2008 Mar]牛跑步_A*
  14. 【深度学习】RNN | GRU | LSTM
  15. springmvc的ModelMap,前台取值
  16. 关于supervisor 的使用以及配置
  17. C语言程序设计--文件操作
  18. 雷林鹏分享:jQuery EasyUI 树形菜单 - 创建带复选框的树形菜单
  19. Android-Drawable(三)
  20. 在Windows下使用svn命令行教程及svn命令行的解释

热门文章

  1. 深入理解Java虚拟机第三版,总结笔记【随时更新】
  2. 这道LeetCode题究竟有什么坑点,让它的反对是点赞的9倍?
  3. .net core kafka 入门实例 一篇看懂
  4. Vue与 Vue组件部分
  5. docker基本维护命令
  6. 情人节闷在家里做画( 安卓统计图MPAndroidChart开发 )
  7. mysql小白系列_12 sysbench
  8. Spring 依赖注入(DI)简介
  9. 六、表达式:前缀&amp;&amp;后缀
  10. 解决WordPress网站被利用xmlrpc.php文件攻击问题