介绍一种解决最近公共祖先的在线算法,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. 树莓派Raspberry Pi微改款,Model B 3+规格探析

    18年3月树莓派基金会推出了ModelB 3+版的新款树莓派单板计算机.从编号数字上看,3+仅是3的再提升,在规格上有小幅异动,究竟改进或提升了哪些部分,本文将对此进行探讨. 树莓派版本观察 从过往的 ...

  2. C语言版本:单链表的实现

    slist.h #ifndef __SLIST_H__ #define __SLIST_H__ #include<cstdio> #include<malloc.h> #inc ...

  3. “人向猿进阶”之软件工程第三课----WORDCOUNT.EXE统计程序

    ---恢复内容开始--- WC项目要求 这个项目要求写一个命令行程序,模仿已有的wc.exe的功能,并加以扩充,给出某程序设计源语言文件的字符数.单词数和行数.给实现一个统计程序,它能正确统计程序文件 ...

  4. [转帖]shell 中的>/dev/null 2>&1 是什么鬼?

    shell 中的>/dev/null 2>&1 是什么鬼? http://blog.jobbole.com/109355/ 背景 我们经常能在shell脚本中发现>/dev/ ...

  5. Android 获取加速传感器的值,并去除杂音

    1.注册和注销传感器 private void registerSensor() { manager.registerListener(this, manager.getDefaultSensor(S ...

  6. 百度搜索 “Java面试题” 前200页(面试必看)

    前言 本文中的题目来源于网上的一篇文章<百度搜索 "Java面试题" 前200页>,但该文章里面只有题目,没有答案.因此,我整理了一些答案发布于本文.本文整理答案的原则 ...

  7. MT【182】系数奇怪的二次函数

    设函数$f(x)=3ax^2-2(a+b)x+b,$其中$a>0,b\in R$证明:当$0\le x\le 1$时,$|f(x)|\le \max\{f(0),f(1)\}$ 分析:由$a&g ...

  8. BZOJ4589 Hard Nim(快速沃尔什变换FWT)

    这是我第一道独立做出来的FWT的题目,所以写篇随笔纪念一下. (这还要纪念,我太弱了) 题目链接: BZOJ 题目大意:两人玩nim游戏(多堆石子,每次可以从其中一堆取任意多个,不能操作就输).$T$ ...

  9. Libre 6005 「网络流 24 题」最长递增子序列 / Luogu 2766 最长递增子序列问题(网络流,最大流)

    Libre 6005 「网络流 24 题」最长递增子序列 / Luogu 2766 最长递增子序列问题(网络流,最大流) Description 问题描述: 给定正整数序列x1,...,xn . (1 ...

  10. [学习笔记]凸优化/WQS二分/带权二分

    从一个题带入:[八省联考2018]林克卡特树lct——WQS二分 比较详细的: 题解 P4383 [[八省联考2018]林克卡特树lct] 简单总结和补充: 条件 凸函数,限制 方法: 二分斜率,找切 ...