LCA(Lowest Common Ancestors),即最近公共祖先,是指在有根树中,找出某两个结点u和v最近的公共祖先。

Tarjan是一种离线算法,时间复杂度O(n+Q),Q表示询问次数,其中使用倍增法加速算法。

首先dfs建立二叉树,并标记深度、父节点。

在LCA函数中,交换x、y保证x深度最大,计算深度差,在进行有限次计算后,保持x、y深度一致,再次进行多次倍增,寻找到最近公共祖先

最后计算节点距离差:deep[x]+deep[y]-deep[t]*2

 #include<iostream>
#include<cstdio>
using namespace std; const int MAXN=;
struct Edge
{
int to,next;
}E[MAXN];
int node,head[MAXN];
int deep[MAXN],fa[MAXN][];
bool vis[MAXN];
int n,m,ans;
int a[MAXN]; void insert(int u,int v)
{
E[++node]=(Edge){v,head[u]};head[u]=node;
E[++node]=(Edge){u,head[v]};head[v]=node;
} void dfs(int x)
{
vis[x]=;
for(int i=;i<=;i++)
{
if(deep[x]<(<<i)) break;
fa[x][i]=fa[fa[x][i-]][i-];
}
for(int i=head[x];i;i=E[i].next)
{
if(vis[E[i].to]) continue;
deep[E[i].to]=deep[x]+;
fa[E[i].to][]=x;
dfs(E[i].to);
}
} int lca(int x,int y)
{
if(deep[x]<deep[y]) swap(x,y);
int d=deep[x]-deep[y];
for(int i=;i<=;i++)
if((<<i)&d) x=fa[x][i];
for(int i=;i>=;i--)
if(fa[x][i]!=fa[y][i])
{
x=fa[x][i];
y=fa[y][i];
}
if(x==y) return x;
else return fa[x][];
} int dis(int x,int y)
{
int t=lca(x,y);
return deep[x]+deep[y]-deep[t]*;
} int main()
{
scanf("%d",&n);
for(int i=;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
insert(x,y);
}
dfs();
scanf("%d",&m);
for(int i=;i<=m;i++)
scanf("%d",&a[i]);
for(int i=;i<m;i++)
ans+=dis(a[i],a[i+]);
printf("%d",ans);
return ;
}

最新文章

  1. NetBean 8 创建EJB
  2. js正则表达式学习
  3. git diff
  4. java注释指导手册
  5. [转]android使用shape stroke描边只保留底部
  6. 李明杰视频 SVN
  7. HTTP请求、响应报文格式
  8. 【Uvalive 2531】 The K-League (最大流-类似公平分配问题)
  9. Excel02-快速无误输入多个零
  10. VS2010/MFC:模态对话框及其弹出过程
  11. phpstorm注册码
  12. 历届试题 剪格子 IDA*
  13. .NET手记-Autofac入门Getting Started
  14. 前端 HTML body标签相关内容 常用标签 分割线 &lt;hr&gt;
  15. conda命令
  16. php扩展yaf 按照配置
  17. 让nodepad++编辑时链接能双击打开
  18. MYSQL数据类型 表基本操作 表记录增删改 单表查询
  19. solr6.6教程-基础环境搭建(一)
  20. 《Hadoop权威指南》读书笔记1

热门文章

  1. Java Timer定时器原理
  2. c#winform循环播放多个视频
  3. BAT的java面试题
  4. html5 嵌入元素 img map areaiframe embed meter object meter
  5. js上拉加载下拉刷新
  6. C++基础--static的用法
  7. python闭包&amp;装饰器&amp;偏函数
  8. supervisor运行virtualenv环境下的nagios-api
  9. js判断一个dom中是否包含另一个dom的方法
  10. WAKE-LINUX-SOFT-linux安装,配置,基础