GeneralLiu

    橙边为轻边

  红边为重边

  绿数为每个点的 top

  橙数为每个点的编号

步骤

1  先预处理 每个点的 deep深度  size子树大小  dad父节点  

2  再预处理 每个点的 top重链顶点

3  就是跳了

应用

洛谷 P2912 [USACO08OCT] 牧场散步

效率蛮高的

此题中用 len[i] 表示 i 到根距离

询问 x 和 y 的距离

答案可用 len[x] + len[y] - 2*len[ lca(x,y) ]表示

而 lca 可以用树剖求出

len[] 在树剖求lca 的预处理中 可以顺带求出来

树剖求 lca 虽然不常用

但它确实很吊

嘻嘻 我的 树剖代码 目前是本题 的 rank1

时间短 空间小

#include<bits/stdc++.h>
#define N 1003
using namespace std;
int cnt,head[N],to[N<<],dis[N<<],next[N<<],len[N],size[N],deep[N],dad[N],n,m,top[N];
int read(){//读入优化
char ch=getchar();
int ans=;
while(!isdigit(ch))ch=getchar();
while(isdigit(ch)){
ans=ans*+ch-'';
ch=getchar();
}
return ans;
}
int lca(int x,int y){//树剖求lca
for(;top[x]!=top[y];){
if(deep[top[x]]<deep[top[y]])x^=y^=x^=y;//利用二进制的 swap()
x=dad[top[x]];
}
if(deep[x]>deep[y])x^=y^=x^=y;
return x;
}
void dfs(int k){//步骤1
int v;
size[k]=,deep[k]=deep[dad[k]]+;
for(int i=head[k];i;i=next[i]){
v=to[i];
if(v!=dad[k])//各种预处理,包括针对本题的 len[]数组
len[v]=dis[i]+len[k],dad[v]=k,dfs(v),size[k]+=size[v];
}
} void dfs1(int k){//步骤2
int t=,v;
if(!top[k])top[k]=k;
for(int i=head[k];i;i=next[i]){
v=to[i];
if(v!=dad[k]&&size[t]<size[v])
t=v;
}
if(t)top[t]=top[k],dfs1(t);
for(int i=head[k];i;i=next[i]){
v=to[i];
if(v!=dad[k]&&v!=t)
dfs1(v);
}
}
int main(){
n=read(),m=read();
int x,y,z;
while(--n){
x=read(),y=read(),z=read();
next[++cnt]=head[x];
to[cnt]=y;
head[x]=cnt;
dis[cnt]=z;
next[++cnt]=head[y];
to[cnt]=x;
head[y]=cnt;
dis[cnt]=z;
}
dfs();
dfs1();
while(m--){
x=read(),y=read();
printf("%d\n",len[x]+len[y]-(len[lca(x,y)]<<));
}
return ;
}

树剖 lca的更多相关文章

  1. BZOJ_2286_[Sdoi2011]消耗战_虚树+树形DP+树剖lca

    BZOJ_2286_[Sdoi2011]消耗战_虚树+树形DP Description 在一场战争中,战场由n个岛屿和n-1个桥梁组成,保证每两个岛屿间有且仅有一条路径可达.现在,我军已经侦查到敌军的 ...

  2. bzoj 3307: 雨天的尾巴【树剖lca+树上差分+线段树合并】

    这居然是我第一次写线段树合并--所以我居然在合并的时候加点结果WAWAWAMLEMLEMLE--!ro的时候居然直接指到la就行-- 树上差分,每个点建一棵动态开点线段树,然后统计答案的时候合并即可 ...

  3. 树剖LCA讲解

    LCA的类型多种多样,只说我知道的,就有倍增求LCA,tarjin求LCA和树链剖分求LCA,当然,也还有很多其他的方法. 其中最常用,速度最快的莫过于树链剖分的LCA了. 树链剖分,首先字面理解一下 ...

  4. 【BZOJ 3626】 [LNOI2014]LCA【在线+主席树+树剖】

    题目链接: TP 题解:   可能是我比较纱布,看不懂题解,只好自己想了…… 先附一个离线版本题解[Ivan] 我们考虑对于询问区间是可以差分的,然而这并没有什么卵用,然后考虑怎么统计答案. 首先LC ...

  5. tarjan,树剖,倍增求lca

    1.tarjan求lca 思想: void tarjan(int u,int f){ for(int i=---){//枚举边 if(v==f) continue; dfs(v); //继续搜 uni ...

  6. BZOJ 3626 [LNOI2014]LCA:树剖 + 差分 + 离线【将深度转化成点权之和】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3626 题意: 给出一个n个节点的有根树(编号为0到n-1,根节点为0,n <= 50 ...

  7. POJ3417Network(LCA+树上查分||树剖+线段树)

    Yixght is a manager of the company called SzqNetwork(SN). Now she's very worried because she has jus ...

  8. 【树剖求LCA】树剖知识点

    不太优美但是有注释的版本: #include<cstdio> #include<iostream> using namespace std; struct edge{ int ...

  9. 树链剖分 树剖求lca 学习笔记

    树链剖分 顾名思义,就是把一课时分成若干条链,使得它可以用数据结构(例如线段树)来维护 一些定义: 重儿子:子树最大的儿子 轻儿子:除了重儿子以外的儿子 重边:父节点与重儿子组成的边 轻边:除重边以外 ...

随机推荐

  1. 数组声明的几种方式以及length属性

    声明一: int[] arr=new int[10]; for(int i=0;i<arr.length;i++){ arr[i]=i; } 声明二: int[] arr2={1,2,3}; 声 ...

  2. UIAlertController的使用,代替UIAlertView和UIActionSheet

    在iOS8以后,UIAlertView就开始被抛弃了. 取而代之是UIAlertController 以前是警示框这样写: UIAlertView *alert = [[UIAlertView all ...

  3. 转】MongoDB主从复制实验 master/slave

    原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/4/ 感谢! Posted: May 31, 2013 Ta ...

  4. 增大PHP允许上传的文件大小;解决POST Content-Length exceeds the limit

    在php.ini中: upload_max_filesize = 1000M ;1GB post_max_size = 1000M 然后重启apache 参考链接

  5. jQuery Ajax使用实例

    <script src="http://cdn.bootcss.com/jquery/1.11.2/jquery.js"></script> <scr ...

  6. HTML5应用缓存与Web Workers

    1.什么是应用程序缓存      HTML5引入了应用程序缓存,这意味着web应用可进行缓存,并可在没有因特网链接时进行访问. 2.应用缓存的优势      离线浏览   用户可在应用离线时使用它们 ...

  7. vue2.0 路由传参(router-link传过去)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. ZooKeeper系列(三)

    前面虽然配置了集群模式的Zookeeper,但是为了方面学建议在伪分布式模式的Zookeeper学习Zookeeper的shell命令. 一.Zookeeper的四字命令 Zookeeper支持某些特 ...

  9. 「Python调试器」,快速定位各种疑难杂症!!

    现在很多的编辑器其实都带着「调试程序」的功能,比如写 c/c++ 的 codeblocks,写 Python 的 pycharm,这种图形界面的使用和显示都相当友好,简单方便易学,这个不是我这篇文章要 ...

  10. mysql 添加记录或者删除记录

    insert into tableName (prod1,pord2,... ) values (v1,v2,...) [,(v1,v2,...),(v1,v2,...)] 程度从强到弱 1.drop ...