LCA 算法(一)ST表
介绍一种解决最近公共祖先的在线算法,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表的更多相关文章
- [算法模板]ST表
[算法模板]ST表 ST表和线段树一样,都能解决RMQ问题(范围最值查询-Range Minimum Query). 我们开一个数组数组\(f[maxn][maxn\log_2]\)来储存数据. 定义 ...
- 【算法】ST表
想学习一下LCA倍增,先 水一个黄题 学一下ST表 ST表 介绍: 这是一个运用倍增思想,通过动态规划来计算区间最值的算法 算法步骤: 求出区间最值 回答询问 求出区间最值: 用f[i][j]来存储从 ...
- 算法学习 - ST表 - 稀疏表 - 解决RMQ问题
2017-08-26 21:44:45 writer:pprp RMQ问题就是区间最大最小值查询问题: 这个SparseTable算法构造一个表,F[i][j] 表示 区间[i, i + 2 ^ j ...
- 【JZOJ5064】【GDOI2017第二轮模拟day2】友好城市 Kosarajo算法+bitset+ST表+分块
题面 在Byteland 一共有n 座城市,编号依次为1 到n,这些城市之间通过m 条单向公路连接. 对于两座不同的城市a 和b,如果a 能通过这些单向道路直接或间接到达b,且b 也能如此到达a,那么 ...
- [数据结构与算法-13]ST表
ST表 主要用来快速查询静态数据区间最大值 思路 数组\(A[i][j]\)存储数列\(\{a_i\}\)中区间\(i \in [i, i+2^j)\)的最大值 查询时只需要查询\(max\{A[i] ...
- 算法学习——st表
st表是一种基于倍增思想的DP. 用于求一个数列中的某个区间的最大/最小值. 用st[i][j]表示从第i个开始往后2^j个点,最大的是多少. 我们令k[i]表示2^i等于多少 那么有转移方程 st[ ...
- [poj3264]rmq算法学习(ST表)
解题关键:rmq模板题,可以用st表,亦可用线段树等数据结构 log10和log2都可,这里用到了对数的换底公式 类似于区间dp,用到了倍增的思想 $F[i][j] = \min (F[i][j - ...
- RMQ算法使用ST表实现
RMQ RMQ (Range Minimum Query),指求区间最小值.普通的求区间最小值的方法是暴力. 对于一个数列: \[ A_1,~ A_2,~ A_3,~ \cdots,~ A_n \] ...
- 算法笔记--st表
概述:用倍增法求区间最值的离线算法,O(nlogn)预处理,O(1)访问. 预处理: 状态:st[i][j]:[i,i+2^j)之间的最值 状态转移:如果j等于0,st[i][j]=a[i] 如果j大 ...
随机推荐
- 通过sqli-labs学习sql注入——基础挑战之less1
环境准备: Phpstudy (PHP+Apache+Mysql) Sql-lab 首先了解下基础知识: URL编码: 因为在浏览器中,当我们访问一个网址的时候,浏览器会自动将用户输入的网址进行UR ...
- 人民币-欧元预测(ARIMA算法)代码
import pandas as pd import matplotlib.pyplot as plt import statsmodels as sm from statsmodels.graphi ...
- 编写JDBC框架:(策略设计模式)
package com.itheima.domain; //一般:实体类的字段名和数据库表的字段名保持一致 //约定优于编码 public class Account { private int id ...
- 关于打包ipa文件以及苹果证书的若干问题
占位 包括windows下生成p12证书,以及apicloud云编译报错等内容.有空更新 http://www.applicationloader.net/blog/zh/2050.html?tdso ...
- 【壹拾壹周】final用户调查
组名: 新蜂组长: 武志远组员: 宫成荣 谢孝淼 杨柳 李峤项目名称:java俄罗斯方块NEO 问卷星由宫成荣同学发布: 温馨提示:点击右键,在新标签中打开图片,单击图片即可放大.或者使用按住ctrl ...
- Drools解决积分问题
http://blog.csdn.net/quzishen/article/details/6163012 http://www.cnblogs.com/ityouknow/p/7297524.htm ...
- 格式化输出Json对象
1.调用方式: alert(JsonUti.convertToString(jsonObj)); //jsonObj为json对象. 2.格式化输出Json对象方法定义: var JsonUti = ...
- JS面向对象编程:对象
一般面向过程的写法都是写很多function,坏处:1.代码复用不好 2.函数名称容易重复冲突 下面介绍面向对象的写法: 在JS中每个函数function都是一个对象. 比如,下面这个就是一个对象,我 ...
- tensorflow的一些基础用法
TensorFlow是一个采用数据流图,用于数值计算的开源软件库.自己接触tensorflow比较的早,可是并没有系统深入的学习过,现在TF在深度学习已经成了"标配",所以打算系统 ...
- UML时序图学习
定义 时序图主要用于展示对象之间交互的顺序. 时序图将交互关系表示为一个二维图.纵向是时间轴,时间沿竖线向下延伸.横向轴代表了在协作中各独立对象的类元角色.类元角色用生命线表示.当对象存在时,角色用一 ...