树链剖分中各种数组的作用:

siz[]数组,用来保存以x为根的子树节点个数

top[]数组,用来保存当前节点的所在链的顶端节点

son[]数组,用来保存重儿子

dep[]数组,用来保存当前节点的深度

fa[]数组,用来保存当前节点的父亲

tid[]数组,用来保存树中每个节点剖分后的新编号

rank[]数组,用来保存当前节点在线段树中的位置

树链剖分求LCA据说很快QWQ,反正我在洛谷上评测的时候比倍增整整快了3分之1.

蓝后我们来说怎么用树链剖分求:

1,第一种情况我们要比较的数在一条链上,比如比较3和12,直接返回深度比较小的数就好了

2,第二种情况我们要比较不在一条链上的两个数,比如我们想求一下10和8的LCA,我们只需要比较一下10和8的重链链顶的深度,我们发现竟然一样深,那我们就用比较早发现的10的链顶就好了,我们吧我们要比较的元素变为自己链顶的父亲(这样就可以实现垮链了),所以近下来我们只需要比较3和8就好,我们发现3和8不在一条链上,所以我们比较3和8链顶的深度,发现8的比较深,所以我们把我们要比较的数变成8的链顶的父亲,也就是3,所以这时候我们要比较的数就都在一条链上了,返回深度比较浅的数就好。

今下来是代码环节,我写了洛谷的3379模板题https://www.luogu.org/problem/show?pid=3379#sub

然后我把我ac的代码粘到这里QWQ

 #include<cstring>
#include<iostream>
#include<cstdio>
using namespace std;
#define MAX 1000 struct NODE{
int point,next;
NODE(){next=;};
}edge[MAX<<]; int N,M,S;
int siz[MAX],dep[MAX],son[MAX],fa[MAX];
int top[MAX],tip[MAX],rank[MAX],tim=;
int edgenum=,link[MAX]; void ADD(int a,int b)
{
edgenum++;
edge[edgenum].point=b;
edge[edgenum].next=link[a];
link[a]=edgenum;
} void pt()
{
for(int i=;i<=N;i++){
printf("%3d",i);
}
cout<<endl;
for(int i=;i<=N;i++){
printf("%3d",top[i]);
}
} void DFS(int x,int deep)
{
siz[x]=;
dep[x]=deep;
for(int i=link[x];i;i=edge[i].next){
int v=edge[i].point;
if(v!=fa[x]){
fa[v]=x;
DFS(v,deep+);
siz[x]+=siz[v];
if(son[x]==-||siz[v]>siz[son[x]]){
son[x]=v;
}
}
}
} void DFS2(int x,int tp)
{
//cout<<"!";
top[x]=tp;
tip[x]=++tim;
rank[tip[x]]=x;
if(son[x]==-)return ;
DFS2(son[x],tp);
for(int i=link[x];i;i=edge[i].next){
int v=edge[i].point;
if(v!=son[x]&&v!=fa[x]){
DFS2(v,v);
}
}
} int LCA(int a,int b) //重点的注释都在这里
{
while(top[a]!=top[b]){ //如果两个的链顶不相等,我们就把他们往一起靠
if(dep[top[a]]>dep[top[b]]) //看那个点的链顶深度大改变那个点
a=fa[top[a]];
else
b=fa[top[b]];
}
return dep[a]>dep[b]?b:a; //返回时要返回深度比较小的数
} void init()
{
int a,b;
cin>>N>>M>>S;
for(int i=;i<N;i++){
scanf("%d%d%*c",&a,&b);
ADD(a,b);
ADD(b,a);
}
memset(son,-,sizeof(siz));
} void work()
{
int a,b;
for(int i=;i<=M;i++){
scanf("%d%d%*c",&a,&b);
printf("%d\n",LCA(a,b));
}
} int main()
{
init();//初始化
DFS(S,);//树链剖分。两个dfs就行
DFS2(S,S);
work(); //输入询问
//pt(); 调试函数,复制下来你们也可以用
//system("pause");
return ;
}

树链剖分求LCA的更多相关文章

  1. cogs 2450. 距离 树链剖分求LCA最近公共祖先 快速求树上两点距离 详细讲解 带注释!

    2450. 距离 ★★   输入文件:distance.in   输出文件:distance.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 在一个村子里有N个房子,一 ...

  2. cogs 2109. [NOIP 2015] 运输计划 提高组Day2T3 树链剖分求LCA 二分答案 差分

    2109. [NOIP 2015] 运输计划 ★★★☆   输入文件:transport.in   输出文件:transport.out   简单对比时间限制:3 s   内存限制:256 MB [题 ...

  3. HDU2586 How far away ? (树链剖分求LCA)

    用树链剖分求LCA的模板: 1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 const ...

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

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

  5. 【POJ1330】Nearest Common Ancestors(树链剖分求LCA)

    Description A rooted tree is a well-known data structure in computer science and engineering. An exa ...

  6. 【模板】树链剖分求LCA

    洛谷3379 #include<cstdio> #include<algorithm> using namespace std; ,inf=1e9; int n,m,x,y,r ...

  7. Hdu 2586 树链剖分求LCA

    Code: #include<cstdio> #include<cstring> #include<vector> #include<algorithm> ...

  8. Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分)

    Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分) Description L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之 ...

  9. Luogu 2590 [ZJOI2008]树的统计 / HYSBZ 1036 [ZJOI2008]树的统计Count (树链剖分,LCA,线段树)

    Luogu 2590 [ZJOI2008]树的统计 / HYSBZ 1036 [ZJOI2008]树的统计Count (树链剖分,LCA,线段树) Description 一棵树上有n个节点,编号分别 ...

随机推荐

  1. 来吧!带你玩转 Excel VBA

    来吧!带你玩转 Excel VBA 从错失良机到艰辛的DOS征程,从坎坷购机自学路到转机起程,从爱好到事业,他从一个完全不懂电脑的人到VBA高级应用者,一切全是自学…… 我是罗刚君,来自四川的一个小县 ...

  2. SSH+JPA查询两个数据库

    1.第一步导包: 1.struts2包: 2.spring包: 3.hibernate包: 4.数据库包: 2.web.xml配置 3.struts2的配置: 1.struts.xml 2.s001. ...

  3. fir.im Weekly - Swift 3.0 的迁移适配指南

    无论你是移动开发者,还是桌面端开发者,或者正在IoT领域探索的技术人员,那么应该更加关注 iDev 全平台开发者大会,也许是后半年 iOS 开发者最盛大的技术盛宴.既有知名公司带来专业视野,又有从 S ...

  4. LigerUI Tree

    <!DOCTYPE html> <%@ page language="java" contentType="text/html; charset=utf ...

  5. iReport 中使用 Chart 图

    iReport 中使用 Chart 图 SSH2项目中需要引入如下两个jar包: jfreechart-1.0.12.jar jcommon-1.0.15.jar 从 iReport 的安装目录下搜索 ...

  6. SQL PASS将于8月24日在北京中医药大学举办线下活动

    活动主题:复制架构的实现和调优以及SQL Server BI在传统行业的应用 地点:北三环东路11号 北京中医药大学 白色的1号楼教学楼后楼5层511房间 时间:2013年8月24日 9:00-12: ...

  7. javascript中的原始值和复杂值

    × 目录 [1]特性 [2]存储方式 [3]访问方式 [4]比较方式 [5]动态属性 前面的话 javascript的数据类型可以分为两种:原始类型和引用类型.原始类型也称为基本类型或简单类型,jav ...

  8. Dijkstra算法(一)之 C语言详解

    本章介绍迪杰斯特拉算法.和以往一样,本文会先对迪杰斯特拉算法的理论论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法 ...

  9. nodejs 调试 node-inspector包

    nodejs  调试调试比较麻烦,让习惯了用chrome浏览器调试的前端同学来说有点不适用  node-inspector这个包让我们可以在chrome上像调试前端代码一样来调试nodejs 1.全局 ...

  10. Mac删除JDK

    安装了1.6以后,没有安装1.7发现Android Studio报错: invalid source release: JDK 1.7 原因是Android Studio需要1.7以上的版本,结果再次 ...