传送门:Problem 1330

https://www.cnblogs.com/violet-acmer/p/9686774.html

  

参考资料:

  http://dongxicheng.org/structure/lca-rmq/

  挑战程序设计竞赛(第二版)

变量解释:

  对有根树进行DFS,将遍历到的节点按照顺序记下,我们将得到一个长度为2N-1的序列,称之为欧拉序列。

  total : 记录dfs遍历过程中回溯的节点编号,其实就是从0->2N-1。

  vs[ ] : 记录DFS访问的顺序,也就是欧拉序列。

  depth[ ] : 记录访问到的节点的深度。

  pos[ ] : 记录各个顶点在va[ ] 中首次出现的下标。

AC代码献上:

基于RMQ的LCA

 #include<iostream>
#include<vector>
#include<cstring>
#include<cmath>
#include<cstdio>
using namespace std;
#define pb(x) push_back(x)
const int maxn=; int n;
int total;
int root;
int vs[*maxn-];//最多需要记录 2*n-1个数
int depth[*maxn-];
int pos[maxn];
vector<int >edge[maxn]; //==========RMQ==========
struct RMQ
{
int dp[][*maxn-];
void Pretreat()//预处理dp[0][]
{
for(int i=;i < total;++i)
dp[][i]=i;
}
void ST()//ST表中记录的是使区间[i,j]的 depth[ ]值最小的下标,级dp[][]存储的是下标,而不是最小值
{
//欧拉序列中一共有total个数
//2^k == total -> k=log2(total) (以2为底),但计算机中的log是以e为底的
//由换底公式可得 k = log(total)/log(2)
int k=log(total)/log();
for(int i=;i <= k;++i)
for(int j=;j <= (total-(<<i));++j)
if(depth[dp[i-][j]] > depth[dp[i-][j+(<<(i-))]])
dp[i][j]=dp[i-][j+(<<(i-))];//记录的是使depth[ ]最小的下标
else
dp[i][j]=dp[i-][j];
}
int LCA(int u,int v)
{
if(u > v)
swap(u,v);
int k=log(v-u+)/log();
if(depth[dp[k][u]] > depth[dp[k][v-(<<k)+]])
return vs[dp[k][v-(<<k)+]];
return vs[dp[k][u]];
}
}_rmq;
//=======================
void Dfs(int v,int f,int d)
{
pos[v]=total;
vs[total]=v;
depth[total++]=d;
for(int i=;i < edge[v].size();++i)
{
int to=edge[v][i];
if(to != f)
{
Dfs(to,v,d+);
vs[total]=v;
depth[total++]=d;
}
}
}
void Init()
{
total=;
root=;
for(int i=;i <= n;++i)
edge[i].clear();
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
Init();
for(int i=;i < n;++i)
{
int u,v;
scanf("%d%d",&u,&v);
edge[u].pb(v);
root=(root == || root == v ? u:root);
}
Dfs(root,-,);
_rmq.Pretreat();
_rmq.ST();
int u,v;
scanf("%d%d",&u,&v);
printf("%d\n",_rmq.LCA(pos[u],pos[v]));
}
return ;
}

最新文章

  1. Node.js:理解stream
  2. HTML CSS 特殊字符表(转载)
  3. Smack4.1注册新用户
  4. 【转载】PyQt QSetting保存设置
  5. poj1251 最小生成树
  6. oc程序代码
  7. LeetCode OJ 147. Insertion Sort List
  8. CSS属性前的 -webkit, -moz,-ms,-o
  9. javascript知识总汇
  10. c++ 私有函数 头文件设计
  11. linux常用命令(查看某些软件是否已安装)
  12. sublime text 2安装及使用
  13. C++中出现的计算机术语4
  14. 在Ubuntu12.0至14.04版本之间用Apache搭建网站运行环境
  15. Professional C# 6 and .NET Core 1.0 - Chapter 39 Windows Services
  16. 北漂面试经历(一(两)年工作经验)-- Java基础部分
  17. JAVA中extends&#160;与implements的用法
  18. 关系型数据库工作原理-查询优化器之数据访问方式(翻译自Coding-Geek文章)
  19. js数组去重排序(封装方法)
  20. Asp.Net MVC Https设置

热门文章

  1. cookie详解(含vue-cookie)
  2. Codeforces Round #503 (by SIS, Div. 2)-C. Elections
  3. 第三周作业(三)---WordCounter
  4. 读《移山之道——VSTS软件开发指南》
  5. Beta版测试报告
  6. 《Linux内核设计与实现》读书笔记四
  7. pl/sql破解方法
  8. 基于Spring3 MVC实现基于form表单文件上传
  9. 续摄影O2O篇
  10. “using NoSQL” under MySQL