题目链接:LCA tarjan离线

  • 这道题目WA无数发,最后还是参考了大神的blog
  • 谁会想到因为一个输入外挂WA呢
  • 大概是我的挂是假挂吧...orz(其实加上外挂,速度提升很多)
  • 用链式前向星保存边的关系,同时为了节省空间也用前向星保存询问
  • 注意要双向建边,同时dfs是先标记为访问状态
  • 否则,会因为双向边的问题陷入死循环,或者改变了深搜的方向
#include <bits/stdc++.h>
using namespace std;
const int maxn = 500001;
const int maxm = 1000001;
struct enode {
int next,to;
} edges[maxm];
struct qnode {
int next,id,to;//id第几次查询
} que[maxm];
int head_e[maxn];//前向星 edges
int head_q[maxn];//前向星 查询
int vis[maxn];
int f[maxn];//并查集父亲数组
int res[maxn];//结果
int cnte=0;
int cntq=0;
int n,m,s;
inline void addedge(int u, int v) {
edges[cnte].to=v;
edges[cnte].next=head_e[u];
head_e[u]=cnte++;
}
inline void addque(int u, int v, int id) {
que[cntq].to=v;
que[cntq].id=id;
que[cntq].next=head_q[u];
head_q[u]=cntq++;
}
//并查集访问父亲
int find(int x) {
return x==f[x] ? x : f[x] = find(f[x]);//压缩
}
void tarjan(int s) {
vis[s]=1;//先标记,不能在回溯时标记,因为双向边
f[s]=s;
for(int i=head_e[s]; i!=-1; i=edges[i].next) {
if(!vis[edges[i].to]) {
tarjan(edges[i].to);
f[edges[i].to]=s;
}
}
for(int i=head_q[s]; i!=-1; i=que[i].next) {
if(vis[que[i].to]==1) {
res[que[i].id]=find(que[i].to);
}
}
}
inline void init() {
memset(vis,0,sizeof(vis));
memset(head_e,-1,sizeof(head_e));
memset(head_q,-1,sizeof(head_q));
for(int i=1; i<=n; ++i) f[i]=i;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m>>s;
init();
int u,v;
for(int i=1; i<n; ++i) {
cin>>v>>u;
addedge(v,u);
addedge(u,v);
}
for(int i=1; i<=m; ++i) {
cin>>v>>u;
addque(u,v,i);
addque(v,u,i);
}
tarjan(s);
for(int i=1; i<=m; ++i) cout<<res[i]<<endl;
return 0;
}

洛谷 P3379 【模板】最近公共祖先(LCA)Tarjan离线的更多相关文章

  1. 最近公共祖先LCA Tarjan 离线算法

    [简介] 解决LCA问题的Tarjan算法利用并查集在一次DFS(深度优先遍历)中完成所有询问.换句话说,要所有询问都读入后才开始计算,所以是一种离线的算法. [原理] 先来看这样一个性质:当两个节点 ...

  2. [模板] 最近公共祖先/lca

    简介 最近公共祖先 \(lca(a,b)\) 指的是a到根的路径和b到n的路径的深度最大的公共点. 定理. 以 \(r\) 为根的树上的路径 \((a,b) = (r,a) + (r,b) - 2 * ...

  3. 【树链剖分】洛谷P3379 树链剖分求LCA

    题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...

  4. POJ 1470 Closest Common Ancestors (最近公共祖先LCA 的离线算法Tarjan)

    Tarjan算法的详细介绍,请戳: http://www.cnblogs.com/chenxiwenruo/p/3529533.html #include <iostream> #incl ...

  5. 最近公共祖先LCA(Tarjan算法)的思考和算法实现

    LCA 最近公共祖先 Tarjan(离线)算法的基本思路及其算法实现 小广告:METO CODE 安溪一中信息学在线评测系统(OJ) //由于这是第一篇博客..有点瑕疵...比如我把false写成了f ...

  6. LCA最近公共祖先(Tarjan离线算法)

    这篇博客对Tarjan算法的原理和过程模拟的很详细. 转载大佬的博客https://www.cnblogs.com/JVxie/p/4854719.html 第二次更新,之前转载的博客虽然胜在详细,但 ...

  7. LCA(最近公共祖先)--tarjan离线算法 hdu 2586

    HDU 2586 How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  8. 最近公共祖先 LCA Tarjan算法

    来自:http://www.cnblogs.com/ylfdrib/archive/2010/11/03/1867901.html 对于一棵有根树,就会有父亲结点,祖先结点,当然最近公共祖先就是这两个 ...

  9. 最近公共祖先LCA(Tarjan算法)的思考和算法实现——转载自Vendetta Blogs

    LCA 最近公共祖先 Tarjan(离线)算法的基本思路及其算法实现 小广告:METO CODE 安溪一中信息学在线评测系统(OJ) //由于这是第一篇博客..有点瑕疵...比如我把false写成了f ...

  10. POJ1470Closest Common Ancestors 最近公共祖先LCA 的 离线算法 Tarjan

    该算法的详细解释请戳: http://www.cnblogs.com/Findxiaoxun/p/3428516.html #include<cstdio> #include<alg ...

随机推荐

  1. 使用bower init创建bower.json文件

    使用bower init 可以快速创建bower.json文件 bower init 回答一系列问题后就可以了,其中大部分问题可以按enter跳过.

  2. PyCharm 如何安装python第三方库及插件

    一.如何安装python第三方库: 1.有一个专门可下载安装第三方库的网址: http://www.lfd.uci.edu/~gohlke/pythonlibs/ Ctrl+f 搜索要下载的第三方库, ...

  3. 1087: [SCOI2005]互不侵犯King

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4276  Solved: 2471[Submit][ ...

  4. IdentityServer4 配置负载均衡

    如果使用 IdentityServer4 做授权服务的负载均衡,默认情况下是不可以的,比如有两个授权服务站点,一个资源服务绑定其中一个授权服务(Authority配置),如果通过另外一个授权服务获取a ...

  5. CI脚本异常退出问题定位

    背景 在CI脚本中,使用类似如下脚本进行项目编译的计时,但在执行过程中,有时会出现CI脚本(命名为ci.sh)未完全执行的情况: #!/bin/bash -e sleep_time=$1 start_ ...

  6. Lombok 使用小结

    Lombok 简介 Lombok 是一种 Java 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO).它通过注释实现这一目的.通过在开发环境中实现 Lo ...

  7. '@P0'附近有语法错误

    做一个分页查询功能,使用到了TOP #{pagenum}然后就报错了.'@P0'附近有语法错误 未解决:#{pagenum}改成${pagenum},但是mybatis报参数未找到错误, 解决:将对应 ...

  8. JSP内容复习

    JSP的3个编译指令,7个动作指令,9个内置对象 三个编译指令(通知servlet引擎的处理消息,只在JSP转换成Servlet时起作用) 1.编译指令 page page指令用户定义JSP页面中的全 ...

  9. fragmentTabHost 使用示例

    目前我们看微信的底部,有四个导航栏,那我们应该来怎么实现类似的导航栏呢? 在 android 4.0 的时候,推出了一个新的工具,fragmentTabHost . fragmentTabHost  ...

  10. 四、VueJs 填坑日记之搭建Axios接口请求工具

    上一章,我们认识了项目的目录结构,以及对项目的目录结构做了一些调整,已经能把项目重新跑起来了.今天我们来搭建api接口调用工具Axios.Vue本身是不支持ajax调用的,如果你需要这些功能就需要安装 ...