传说中比O(1)还快的求LCA的方法
再加上正向表优化,

#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
#define M 100005
#define FOR(i,x,y) for(int i=(x);i<=(y);i++)
#define DOR(i,x,y) for(int i=(x);i>=(y);i--)
int nxt[M<<1],head[M],To[M<<1],V[M<<1];
int tta;
void addedge(int a,int b,int c){nxt[++tta]=head[a];head[a]=tta;To[tta]=b;V[tta]=c;
}
int fa[M],dep[M],dis[M],sz[M],son[M],Top[M],Tid[M],tim;
void ldfs(int x,int f){fa[x]=f;dep[x]=dep[f]+1;sz[x]=1;for(int i=head[x];i;i=nxt[i]){int y=To[i];if(y==f)continue;dis[y]=dis[x]+V[i];ldfs(y,x);sz[x]+=sz[y];if(!~son[x]||sz[son[x]]>sz[son[x]])son[x]=y;}
}
void rdfs(int x,int tp){Top[x]=tp;Tid[x]=++tim;if(!~son[x])return;rdfs(son[x],tp);for(int i=head[x];i;i=nxt[i]){int y=To[i];if(y==fa[x]||y==son[x])continue;rdfs(y,y);}
}
int LCA(int x,int y){while(Top[x]!=Top[y]){if(dep[Top[x]]<dep[Top[y]])swap(x,y);x=fa[Top[x]];}if(dep[x]>dep[y])swap(x,y);return x;
}
int main(){int n,m;scanf("%d%d",&n,&m);memset(son,-1,sizeof(son));FOR(i,1,n-1){int a,b,c;scanf("%d%d%d",&a,&b,&c);addedge(a,b,c);addedge(b,a,c);}ldfs(1,0);rdfs(1,1);for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);int lca=LCA(x,y);printf("%d\n",dis[x]+dis[y]-2*dis[lca]);}return 0;
}

树链剖分求lca模板相关推荐

  1. POJ - 1330 Nearest Common Ancestors(树上倍增/树链剖分求LCA)

    题目链接:点击查看 题目大意:给出一棵有根树,我们需要求出两个点的lca 题目分析:因为题目说了是有根树,所以我们在建图的时候直接建有向图就好了,并且记录一下每个点的入度,建完图后找一下入度为0的点, ...

  2. 树链剖分概念及模板 + 例题 [POJ3237 tree + 软件包管理器]

    文章目录 概念 模板 例题1:软件包管理器 题目 题解 代码实现 例题2:POJ3237 tree 题目 题解 代码实现 概念 树链剖分主要是用于解决以下这两个问题. 1.更改树上点x到点y的最短路径 ...

  3. 树链剖分边权模板spoj375

    树链剖分是树分解成多条链来解决树上两点之间的路径上的问题 如何求出树链:第一次dfs求出树上每个结点的大小和深度和最大的儿子,第二次dfs就能将最大的儿子串起来并hash(映射)到线段树上(或者其他数 ...

  4. 【树链剖分】LCA(P4211)

    正题 P4211 题目大意 给你一棵树,有m次询问,每次询问要回答∑i=lrdep[lca(x,i)]\sum_{i=l}^rdep[lca(x,i)]∑i=lr​dep[lca(x,i)] 解题思路 ...

  5. 【树链剖分】【模板】树的统计(P2590)

    小目录 链接 题目描述 样例输入 样例输出 思路 代码 链接 Luogu P2590 题目描述 给出一棵树,对该树进行单点修改,区间查询最大值,区间求和 样例输入 4 1 2 2 3 4 1 4 2 ...

  6. hdu3966 树链剖分点权模板+线段树区间更新/树状数组区间更新单点查询

    点权树的模板题,另外发现树状数组也是可以区间更新的.. 注意在对链进行操作时方向不要搞错 线段树版本 #include<bits/stdc++.h> using namespace std ...

  7. HDU - 6393 Traffic Network in Numazu(线段树+LCA+树链剖分+并查集)

    题目链接:点击查看 题目大意:给出一个由n个点和n条边组成的图,每条边都有权值,题目保证图是连通的,然后给出m个询问,每次询问分为两种形式: 0 x y:将第x条边的权值修改为y 1 x y:查询x- ...

  8. 归纳(四):树链剖分

    剖分的意义 能用线段树搞想要的信息. (其实可以只用来求LCA) 需要的东西 七个数组,在两次dfs中处理出来. dfs1: dep[]:深度 fa[]:父亲 son[]:重儿子 siz[]:子树大小 ...

  9. ⌈洛谷1505⌋⌈BZOJ2157⌋⌈国家集训队⌋旅游【树链剖分】

    题目链接 [洛谷] [BZOJ] 题目描述 Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T ...

最新文章

  1. In terms of 的用法总结
  2. HP-UX磁带备份错误收集
  3. Java中ThreadPoolExecutor的参数理解
  4. 最简单也最难——如何获取到Android控件的高度,获取android控件
  5. 【开源项目之路】jquery的build问题
  6. 2019年度最受欢迎中国开源软件评选, 请给JeecgBoot 投票,谢谢支持
  7. Spark 机器学习拾遗
  8. 机器学习(2)——K-近邻算法讲解
  9. kindle看pdf不清楚_无法在Kindle上阅读PDF格式的电子书,该怎么办呢?
  10. 拉格朗日插值法总结模板(1~n)
  11. 安装ie9提示未能完成安装_win10系统安装iE提示“internet Explorer未能完成安装”的方法介绍...
  12. linux用户管理(1)----创建用户(adduser和useradd)和删除用户(userdel)
  13. C++续行符(反斜杠符号)
  14. 鸿蒙时期的修真等级,相关介绍关于小说里的修真和武器等级划分
  15. 企业WiFi管理需求
  16. 系统垃圾文件清理器 制作:China Doll (莫增成)
  17. 思科三层交换机路由配置
  18. php curl访问HTTPS页面502
  19. 牛血不小心污渍了被子或者衣服,怎么洗干净?
  20. 公众号知识付费怎么代开通

热门文章

  1. 细说框架风云 JSF能否拯救WEB江湖
  2. Windows系统Apache下载和安装
  3. 嗯?上线前用LeakCanary检测了啊,怎么线上还有OOM?
  4. 闲云旅游网01(基于vue+element ui)
  5. MySQL面试知识点追命连环问(一)执行流程存储引擎查询缓存
  6. Unity学习笔记--siki学院保卫萝卜
  7. Binder对象死亡通知机制
  8. 前沿重器[15] | R-Dropout——一次不行就两次
  9. 乱七八糟介绍一款文献检索网站,web of science
  10. 【免费游戏分享】iSwinging(飞天侠):像蜘蛛侠一样自由的飞檐走壁