poj 1330(RMQ&LCA入门题)
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 ;
}
poj 1330(RMQ&LCA入门题)的更多相关文章
- POJ 1330(LCA/倍增法模板)
链接:http://poj.org/problem?id=1330 题意:q次询问求两个点u,v的LCA 思路:LCA模板题,首先找一下树的根,然后dfs预处理求LCA(u,v) AC代码: #inc ...
- POJ 3207 【2-SAT入门题 + 强连通分量】
这道题是我对于2-SAT问题的入门题:http://poj.org/problem?id=3207 一篇非常非常非常好的博客,很详细,认真看一遍差不多可以了解个大概:https://blog.csdn ...
- POJ 2342 树形DP入门题
有一个大学的庆典晚会,想邀请一些在大学任职的人来參加,每一个人有自己的搞笑值,可是如今遇到一个问题就是假设两个人之间有直接的上下级关系,那么他们中仅仅能有一个来參加,求请来一部分人之后,搞笑值的最大是 ...
- LCA入门题集小结
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 题目: How far away ? Time Limit: 2000/1000 MS (Jav ...
- POJ 1330 (LCA)
http://poj.org/problem?id=1330 题意:给出一个图,求两个点的最近公共祖先. sl :水题,贴个模板试试代码.本来是再敲HDU4757的中间发现要用LCA, 操蛋只好用这 ...
- poj 1330(初探LCA)
Nearest Common Ancestors Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 23795 Accept ...
- POJ 1330 Tarjan LCA、ST表(其实可以数组模拟)
题意:给你一棵树,求两个点的最近公共祖先. 思路:因为只有一组询问,直接数组模拟好了. (写得比较乱) 原题请戳这里 #include <cstdio> #include <bits ...
- POJ 3984(DFS入门题 +stack储存路径)
POJ 3984 Description 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, ...
- Nearest Common Ancestors POJ - 1330 (LCA)
Nearest Common Ancestors Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 34657 Accept ...
随机推荐
- centos6.8下LNMP (nginx1.8.0+php5.6.10+mysql5.6.12) - 部署手册
在平时运维工作中,经常需要用到LNMP应用框架.以下对LNMP环境部署记录下: 1)前期准备:为了安装顺利,建议先使用yum安装依赖库[root@opd ~]#yum install -y make ...
- MySQL的启动程序
1.mysqld: mysql server [root@test bin]# ./mysqld --user=mysql & [root@test bin]# ps ...
- 结构体内嵌比较函数bool operator < (const node &x) const {}
直接看别人的链接 [http://www.cnblogs.com/ZERO-/p/9347296.html]
- 读书笔记(chapter4)
进程调度 4.1多任务 1.多任务系统可以划分为:非抢占式多任务和抢占式多任务: (在此模式下,由调度程序来决定什么时候停止一个进程的运行,以便其他进程能够得到执行机会,这个动作叫抢占: 时间片实际上 ...
- python 使用read_csv读取 CSV 文件时报错
读取csv文件时报错 df = pd.read_csv('c:/Users/NUC/Desktop/成绩.csv' ) Traceback (most recent call last): File ...
- HDOJ2007_平方和与立方和
应该注意到一个细节是题目中没有说明输入的两个数据一定是先小后大的关系,所以需要做一次判断.其他的比较简单. HDOJ2007_平方和与立方和 #include<iostream> #inc ...
- pandas修改全列的时间格式 无需使用apply
df.date.dt.strftime('%Y%m%d') #实现全列修改时间格式
- Failed to execute goal org.springframework.boot
报错 [ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:1.4.0.RELEASE:ru ...
- 服务器RAID设置以及简单理解
备注: 适用于测试环境,生产环境暂时未验证 1. RAID种类 最高性能的RAID0 完全拆分所有的IO 不进行校验 但是单盘损坏, 数据完全丢失 最高损耗的RAID1 损失一半的存储容量, 做镜像, ...
- 借鉴 学习 DELPHI 通用函数 哈哈
[转]关于Delphi通用涵数 http://m.blog.csdn.net/blog/dragonjiang5460/1196927 2006-9-8阅读2016 评论0 DELPHI程序注册码设计 ...