介绍一种解决最近公共祖先的在线算法,st表,它是建立在线性中的rmq问题之上。

 

代码:

 

 //LCA: DFS+ST(RMQ)

 #include<cstdio>
#include<cctype>
#include<iostream>
using namespace std; const int size=;
int n,m,s,tot;
int first[size],log[size<<],f[size<<][],head[size<<],p[size<<][];
bool vis[size];
struct node1
{
int path,depth;
}a[size*];
struct node2
{
int next,to;
}e[size*]; inline int read()
{
int x=,f=;
char c=getchar();
while (!isdigit(c))
f=c=='-'?-:,c=getchar();
while (isdigit(c))
x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
} inline int write(int x)
{
if (x<)
x=-x;
if (x>)
write(x/);
putchar(x%+);
} inline void add(int from,int to)
{
++tot;
e[tot].to=to;
e[tot].next=head[from];
head[from]=tot;
} inline void logn()
{
int i;
log[]=-;
for (i=;i<=n*+;i++)
log[i]=log[(i>>)]+;
} inline void DFS(int x,int dep)
{
a[++tot].path=x;
a[tot].depth=dep;
first[x]=tot;
vis[x]=true;
for (int i=head[x];i;i=e[i].next)
if (!vis[e[i].to])
{
DFS(e[i].to,dep+);
a[++tot].path=x;
a[tot].depth=dep;
}
} inline void ST()
{
int i,j;
for (i=;i<=tot;i++)
f[i][]=i;
for (j=;j<=log[tot];j++)
for (i=;i+(<<j)<=tot;i++)
{
if (a[f[i][j-]].depth<a[f[i+(<<j-)][j-]].depth)
f[i][j]=f[i][j-];
else
f[i][j]=f[i+(<<j-)][j-];
}
} inline int RMQ(int l,int r)
{
int w=log[r-l+];
return a[f[l][w]].depth<a[f[r-(<<w)+][w]].depth?f[l][w]:f[r-(<<w)+][w];
} inline int LCA(int u,int v)
{
int x=first[u],y=first[v];
if (x>y)
swap(x,y);
return a[RMQ(x,y)].path;
} int main()
{
int i,j,x,y;
n=read();
m=read();
s=read();
logn();
for (i=;i<n;i++)
{
x=read();
y=read();
add(x,y);
add(y,x);
}
tot=;
DFS(s,);
ST();
while (m--)
{
x=read();
y=read();
write(LCA(x,y));
putchar();
}
return ;
}

LCA 算法(一)ST表的更多相关文章

  1. [算法模板]ST表

    [算法模板]ST表 ST表和线段树一样,都能解决RMQ问题(范围最值查询-Range Minimum Query). 我们开一个数组数组\(f[maxn][maxn\log_2]\)来储存数据. 定义 ...

  2. 【算法】ST表

    想学习一下LCA倍增,先 水一个黄题 学一下ST表 ST表 介绍: 这是一个运用倍增思想,通过动态规划来计算区间最值的算法 算法步骤: 求出区间最值 回答询问 求出区间最值: 用f[i][j]来存储从 ...

  3. 算法学习 - ST表 - 稀疏表 - 解决RMQ问题

    2017-08-26 21:44:45 writer:pprp RMQ问题就是区间最大最小值查询问题: 这个SparseTable算法构造一个表,F[i][j] 表示 区间[i, i + 2 ^ j ...

  4. 【JZOJ5064】【GDOI2017第二轮模拟day2】友好城市 Kosarajo算法+bitset+ST表+分块

    题面 在Byteland 一共有n 座城市,编号依次为1 到n,这些城市之间通过m 条单向公路连接. 对于两座不同的城市a 和b,如果a 能通过这些单向道路直接或间接到达b,且b 也能如此到达a,那么 ...

  5. [数据结构与算法-13]ST表

    ST表 主要用来快速查询静态数据区间最大值 思路 数组\(A[i][j]\)存储数列\(\{a_i\}\)中区间\(i \in [i, i+2^j)\)的最大值 查询时只需要查询\(max\{A[i] ...

  6. 算法学习——st表

    st表是一种基于倍增思想的DP. 用于求一个数列中的某个区间的最大/最小值. 用st[i][j]表示从第i个开始往后2^j个点,最大的是多少. 我们令k[i]表示2^i等于多少 那么有转移方程 st[ ...

  7. [poj3264]rmq算法学习(ST表)

    解题关键:rmq模板题,可以用st表,亦可用线段树等数据结构 log10和log2都可,这里用到了对数的换底公式 类似于区间dp,用到了倍增的思想 $F[i][j] = \min (F[i][j - ...

  8. RMQ算法使用ST表实现

    RMQ RMQ (Range Minimum Query),指求区间最小值.普通的求区间最小值的方法是暴力. 对于一个数列: \[ A_1,~ A_2,~ A_3,~ \cdots,~ A_n \] ...

  9. 算法笔记--st表

    概述:用倍增法求区间最值的离线算法,O(nlogn)预处理,O(1)访问. 预处理: 状态:st[i][j]:[i,i+2^j)之间的最值 状态转移:如果j等于0,st[i][j]=a[i] 如果j大 ...

随机推荐

  1. Android与Unity相互调用

    1. 在Unity里调用Android代码: void OnGUI(){ AndroidJavaClass jc = new AndroidJavaClass("com.some.packa ...

  2. PAT甲题题解-1053. Path of Equal Weight (30)-dfs

    由于最后输出的路径排序是降序输出,相当于dfs的时候应该先遍历w最大的子节点. 链式前向星的遍历是从最后add的子节点开始,最后添加的应该是w最大的子节点, 因此建树的时候先对child按w从小到大排 ...

  3. 《linux内核》课本第五章读书笔记

  4. 专业实训题目需求分析(3D推箱子)

    业务需求:    游戏提供主菜单让玩家进行游戏设置.帮助说明,推箱子的小人可以前后左右转动,箱子可以被上下左右的推动,要有关卡设置,障碍物设置,游戏提供背景音乐的功能,要实现3D效果. 面向的用户类型 ...

  5. Day Nine

    站立式会议 站立式会议内容总结 331 今天:学习plupload 遇到问题:无 明天:学习中文分词 442 今天:解决gradle以及项目计划页面的bug 遇到的问题:调用工具类以及配置gradle ...

  6. RYU 灭龙战 second day(内容大部分引自网络)

    RYU 灭龙战 second day(内容大部分引自网络) 写好的markdown重启忘了保存...再写一次RLG 巨龙的稀有装备-RYU代码结构 RYU控制器代码结构的总结 RYU入门教程 RYU基 ...

  7. RYU 的选择以及安装

    RYU 的选择以及安装 由于近期的项目需求,不得已得了解一下控制器内部发现拓扑原理,由于某某应用中的控制器介绍中使用的RYU,所以打算把RYU装一下试试.出乎意料的是,RYU竟是我之前装过最最轻便的控 ...

  8. ElasticSearch 2 (20) - 语言处理系列之如何开始

    ElasticSearch 2 (20) - 语言处理系列之如何开始 摘要 Elasticsearch 配备了一组语言分析器,为世界上大多数常见的语言提供良好的现成基础支持. 阿拉伯语.亚美尼亚语,巴 ...

  9. 第五周可执行代码 以及 Canvas 制作个人PSP分类饼图

    第五周可执行代码已经上传github,地址是https://github.com/yanyige/CourseWork/tree/master/Week4.以及效果在http://yanyige.gi ...

  10. Jenkins配置匿名用户拥有只读权限

    场景:查看cucumber reporting测试报告时需要登陆,比较麻烦 解决:允许匿名用户拥有只读权限 操作:Jenkins->系统管理->全局安全配置->授权策略,勾选“All ...