题目链接: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. aapt不是内部命令

    解决方法:在E:\sdk\build-tools\目录下的任意文件夹下查找aapt,复制到E:\sdk\platform-tools,具体盘符是情况而定,如果还不行,尝试配置环境变量!

  2. swift 之函数式编程(一)

    1. 什么是函数式编程? 函数式编程是阿隆佐思想的在现实世界中的实现, 它将电脑运算视为数学上的函数计算,并且避免使用程序状态以及异变物件. 函数式编程的最重要基础是λ演算.而且λ演算的函數可以接受函 ...

  3. AngularJS学习篇(二十)

    AngularJS 包含 在 AngularJS 中,你可以在 HTML 中包含 HTML 文件. 使用 AngularJS, 你可以使用 ng-include 指令来包含 HTML 内容: < ...

  4. Jquery基础笔记

    1.$(function(){               等价于     window.onload=function(){ })                               } 2 ...

  5. Java多线程Future模式

    Java多线程Future模式有些类似于Ajax的异步请求Future模式的核心在于:去除了主函数的等待时间,并使得原本需要等待的时间段可以用于处理其他业务逻辑 假设服务器的处理某个业务,该业务可以分 ...

  6. Java Enum用法详解

    Java Enum用法详解 用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举 ...

  7. vs2015添加T4模版

    <#@ template language="C#" debug="false" hostspecific="true"#> & ...

  8. axios在vue中的简单配置与使用

    一.axios 简介 axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,它本身具有以下特征:https://hzzly.github.io/2017/03/12/ ...

  9. 深度学习之tensorflow (一)

    一.TensorFlow简介 1.TensorFlow定义: tensor  :张量,N维数组 Flow   :  流,基于数据流图的计算 TensorFlow : 张量从图像的一端流动到另一端的计算 ...

  10. SpringMVC注解HelloWorld

    今天整理一下SpringMVC注解 欢迎拍砖 @RequestMapping RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是 ...