题意:给你一棵树,求两个点的最近公共祖先。

思路:因为只有一组询问,直接数组模拟好了。

(写得比较乱)

原题请戳这里

#include <cstdio>
#include <bitset>
#include <cstring>
#include <algorithm>
using namespace std;
int first[10005],v[10005],next[10005];
int main()
{
int cas;
scanf("%d",&cas);
while(cas--)
{
bitset<10005> b;
memset(first,-1,sizeof(first));
int tot=1,n,x,s,e;
scanf("%d",&n);
for(int i=1;i<n;i++)
{
scanf("%d%d",&v[tot],&x);
next[i]=first[x];
first[x]=tot++;
}
scanf("%d%d",&s,&e);
b.flip(s);
while(first[s]!=-1)
{
s=v[first[s]];
b.flip(s);
}
if(b.test(e))
{
printf("%d\n",e);
goto end;
}
while(first[e]!=-1)
{
e=v[first[e]];
if(b.test(e))
{
printf("%d\n",e);
break;
}
}
end:;
}
}

搞个Tarjan玩玩

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int first[10005],cas,next[10005],v[10005],s,e,ans,f[10005];
bool vis[10005];
int find(int x)
{
return f[x]==x?x:f[x]=find(f[x]);
}
void Tarjan(int x)
{
f[x]=x;
for(int i=first[x];~i;i=next[i])
{
Tarjan(v[i]);
f[find(v[i])]=x;
}
vis[x]=1;
if(x==s&&vis[e])
{
ans=find(e);
}
else if(x==e&&vis[s])
{
ans=find(s);
}
}
int main()
{
scanf("%d",&cas);
while(cas--)
{
memset(first,-1,sizeof(first));
memset(vis,0,sizeof(vis));
int tot=1,n,x,root;
scanf("%d",&n);
for(int i=1;i<n;i++)
{
scanf("%d%d",&x,&v[tot]);
next[i]=first[x];
vis[v[tot]]=1;
first[x]=tot++;
}
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
root=i;
break;
}
}
memset(vis,0,sizeof(vis));
scanf("%d%d",&s,&e);
Tarjan(root);
printf("%d\n",ans);
}
}



(对于这道题,还是模拟大法好啊)

如果给多组询问,就只能用Tarjan或者ST了。。

ST的:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int cases,root,n,jyx,jyy,tot,fa[100005][19];
int in[100005],dep[100005],first[100005],next[100005],v[100005];
void add(int x,int y){
v[tot]=y;
next[tot]=first[x];
first[x]=tot++;
}
void dfs(int x)
{
for(int i=1;i<=18;i++)
{
fa[x][i]=fa[fa[x][i-1]][i-1];
}
for(int i=first[x];~i;i=next[i])
{
dep[v[i]]=dep[x]+1;
dfs(v[i]);
}
}
int lca(int x,int y)
{
if(dep[x]<dep[y])swap(x,y);
for(int i=18;i>=0;i--)
{
if(dep[x]>=dep[y]+(1<<i))x=fa[x][i];
if(x==y)return x;
}
for(int i=18;i>=0;i--)
{
if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];
}
return fa[x][0];
}
int main()
{
scanf("%d",&cases);
while(cases--){
memset(first,-1,sizeof(first));
memset(in,0,sizeof(in));
tot=0;
scanf("%d",&n);
for(int i=1;i<n;i++){
scanf("%d%d",&jyx,&jyy);
fa[jyy][0]=jyx;
add(jyx,jyy);
in[jyy]++;
}
scanf("%d%d",&jyx,&jyy);
for(int i=1;i<=n;i++)if(!in[i])root=i;
dfs(root);
printf("%d\n",lca(jyx,jyy));
}
}

POJ 1330 Tarjan LCA、ST表(其实可以数组模拟)的更多相关文章

  1. 51nod 1766 树上的最远点对 | LCA ST表 线段树 树的直径

    51nod 1766 树上的最远点对 | LCA ST表 线段树 树的直径 题面 n个点被n-1条边连接成了一颗树,给出a~b和c~d两个区间,表示点的标号请你求出两个区间内各选一点之间的最大距离,即 ...

  2. poj 1330(RMQ&LCA入门题)

    传送门:Problem 1330 https://www.cnblogs.com/violet-acmer/p/9686774.html 参考资料: http://dongxicheng.org/st ...

  3. POJ 3264 Balanced Lineup | st表

    题意: 求区间max-min st表模板 #include<cstdio> #include<algorithm> #include<cstring> #inclu ...

  4. st表树状数组入门题单

    预备知识 st表(Sparse Table) 主要用来解决区间最值问题(RMQ)以及维护区间的各种性质(比如维护一段区间的最大公约数). 树状数组 单点更新 数组前缀和的查询 拓展:原数组是差分数组时 ...

  5. BZOJ 4556: [Tjoi2016&Heoi2016]字符串(后缀数组 + 二分答案 + 主席树 + ST表 or 后缀数组 + 暴力)

    题意 一个长为 \(n\) 的字符串 \(s\),和 \(m\) 个询问.每次询问有 \(4\) 个参数分别为 \(a,b,c,d\). 要你告诉它 \(s[a...b]\) 中的所有子串 和 \(s ...

  6. poj 1330(初探LCA)

    Nearest Common Ancestors Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 23795   Accept ...

  7. POJ 1330 (LCA)

    http://poj.org/problem?id=1330 题意:给出一个图,求两个点的最近公共祖先. sl :水题,贴个模板试试代码.本来是再敲HDU4757的中间发现要用LCA,  操蛋只好用这 ...

  8. POJ 1330(LCA/倍增法模板)

    链接:http://poj.org/problem?id=1330 题意:q次询问求两个点u,v的LCA 思路:LCA模板题,首先找一下树的根,然后dfs预处理求LCA(u,v) AC代码: #inc ...

  9. Nearest Common Ancestors POJ - 1330 (LCA)

    Nearest Common Ancestors Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 34657   Accept ...

随机推荐

  1. git clone下载代码,中途断掉怎么办?

    问题如下: 解决办法: 1)运行以下命令进行clone $ git clone --recursive https:xxxxxx 2)进入项目根目录,继续下载 $ cd eigen-git-mirro ...

  2. B.3 字典

    在框架中,字典的选择要比列表少得多.只有三个主流的非并发 IDictionary<TKey, TValue> 实现,此外还有 ExpandoObject (第14章已介绍过). Concu ...

  3. vue-cli3 中的环境变量

    官方文档是这样写的: src同名文件夹下的建立 .env.[model] 配置文件  // mode:production development ... 载入的变量会对vue-cli-service ...

  4. BZOJ 4327 [JSOI2012]玄武密码 (AC自动机)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=4327 题解: 做法挺显然,建出AC自动机之后在上面跑,标记所有走过的点,然后再进行递推 ...

  5. nyoj_264_国王的魔镜_201311271800

    国王的魔镜 时间限制:3000 ms  |           内存限制:65535 KB 难度:1   描述 国王有一个魔镜,可以把任何接触镜面的东西变成原来的两倍——只是,因为是镜子嘛,增加的那部 ...

  6. mongodb之安装

    前言 系统环境是CentOS,linux只支持64位版本 yum源安装 rpm包说明 mongodb-org-server 包含mongod进程,关联配置,初始化脚本mongodb-org-mongo ...

  7. tabBar颜色改动

    //未点击的颜色 [[UITabBarItem appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKey ...

  8. 关于Android开发数据存储的方式(一)

    关于Android开发数据存储方式(一) 在厦门做Android开发也有两个月了,快情人节了.我还在弄代码. 在微信平台上开发自己的APP,用到了数据存储的知识,如今总结一下: 整体的来讲.数据存储方 ...

  9. 在NSUserDefaults中保存自己定义的对象

    在iOS开发中.须要用到一些回调值(从A到B,从B返回时把B中的值带回A中).事实上方法也非常多(delegate,block.nsuserdefaults等).我想用NSUserDefaults回调 ...

  10. QueryString 地址栏参数

    MXS&Vincene  ─╄OvЁ  &0000002 ─╄OvЁ  MXS&Vincene MXS&Vincene  ─╄OvЁ:今天很残酷,明天更残酷,后天很美好 ...