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 ...
随机推荐
- Redis主从复制原理总结
和Mysql主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况.为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构,Redi ...
- 求去掉一条边使最小割变小 HAOI2017 新型城市化
先求最小割,然后对残量网络跑Tarjan.对于所有满流的边,若其两端点不在同一个SCC中,则这条边是满足条件的. 证明见 来源:HAOI2017 新型城市化
- 2017-2018-2 1723《程序设计与数据结构》实验四 & 实验五 & 课程总结 总结
作业地址 实验四作业:https://edu.cnblogs.com/campus/besti/CS-IMIS-1723/homework/1943 提交情况如图: 实验五作业:https://edu ...
- b总结
Beta 答辩总结 评审表 组名 格式 内容 ppt 演讲 答辩 总计 天机组 15 15 13 15 14 72 PMS 16 16 15 16 16 79 日不落战队 16 17 17 17 17 ...
- 剑指offer:变态跳台阶
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 思路 首先想到的解决方案是根据普通跳台阶题目改编,因为可以跳任意级,所以要 ...
- ACL访问控制
/etc/squid/squid.conf 定义语法: acl aclname acltype string acl aclname acltype "file" s ...
- poj 3694 Network(割边+lca)
题目链接:http://poj.org/problem?id=3694 题意:一个无向图中本来有若干条桥,有Q个操作,每次加一条边(u,v),每次操作后输出桥的数目. 分析:通常的做法是:先求出该无向 ...
- PHP IF ELSE简化/三元一次式的使用
一般我们会这样写: <? if($_GET['time']==null) { $time = time(); } else { $time = $_GET['time']; } echo $ti ...
- ABP框架学习
一.总体与公共结构 1,ABP配置 2,多租户 3,ABP Session 4,缓存 5,日志 6,设置管理 7,Timing 8,ABPMapper 9,发送电子邮件 二.领域层 10,实体 11, ...
- codeforces369A
Valera and Plates CodeForces - 369A Valera is a lazy student. He has m clean bowls and k clean plate ...