hdu 2586 How far away ? 倍增求LCA
倍增求LCA
LCA函数返回(u,v)两点的最近公共祖先
#include <bits/stdc++.h>
using namespace std; const int N = *;
struct node {
int v,val,next;
node(){}
node(int vv,int va,int nn):v(vv),val(va),next(nn){}
}E[N];
int n,m;
int tot,head[N],dis[N],f[N][],dep[N]; void init() {
tot = ;
memset(head,,sizeof(head));
memset(dis,,sizeof(dis));
memset(f,,sizeof(f));
memset(dep,,sizeof(dep));
} void add(int u,int v,int val) {
E[++tot].next = head[u];
E[tot].v = v;
E[tot].val = val;
head[u] = tot;
} void addEdge(int u,int v,int val) {
add(u,v,val);
add(v,u,val);
} void dfs(int x,int fa) {
f[x][] = fa;
for(int i=;f[x][i-];i++)
f[x][i] = f[f[x][i-]][i-];
for(int i=head[x]; i; i=E[i].next) {
int v = E[i].v;
if(v != fa) {
dis[v] = dis[x] + E[i].val;
dep[v] = dep[x] + ;
dfs(v,x);
}
}
} int lca(int u,int v) {
if(dep[u] < dep[v]) swap(u,v);
//int ans = dep[u] - dep[v];
for(int i=;i>=;i--)
if(dep[u]-(<<i)>=dep[v])
u = f[u][i];
for(int i=;i>=;i--) {
if(f[u][i]!=f[v][i])
u=f[u][i],v=f[v][i];//ans+=(2<<i);
}
//if(u!=v) ans+=2;
//return ans;
if(u!=v) return f[u][];
else return u;
} int main () {
//freopen("in.txt","r",stdin);
int T; scanf("%d",&T);
while (T--) {
init();
scanf("%d %d",&n, &m);
for(int i=;i<=n-;i++) {
int u,v,val;
scanf("%d %d %d",&u,&v,&val);
addEdge(u,v,val);
}
dfs(,);
// cout <<"yes" <<endl;
while(m--) {
int u,v; scanf("%d %d",&u,&v);
int t = lca(u,v);
printf("%d\n",dis[u]+dis[v]-*dis[t]);
}
}
return ;
}
hdu 2586 How far away ? 倍增求LCA的更多相关文章
- hdu 2586 欧拉序+rmq 求lca
题意:求树上任意两点的距离 先说下欧拉序 对这颗树来说 欧拉序为 ABDBEGBACFHFCA 那欧拉序有啥用 这里先说第一个作用 求lca 对于一个欧拉序列,我们要求的两个点在欧拉序中的第一个位置之 ...
- 树上倍增求LCA(最近公共祖先)
前几天做faebdc学长出的模拟题,第三题最后要倍增来优化,在学长的讲解下,尝试的学习和编了一下倍增求LCA(我能说我其他方法也大会吗?..) 倍增求LCA: father[i][j]表示节点i往上跳 ...
- [算法]树上倍增求LCA
LCA指的是最近公共祖先(Least Common Ancestors),如下图所示: 4和5的LCA就是2 那怎么求呢?最粗暴的方法就是先dfs一次,处理出每个点的深度 然后把深度更深的那一个点(4 ...
- 【倍增】洛谷P3379 倍增求LCA
题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...
- 倍增求lca模板
倍增求lca模板 https://www.luogu.org/problem/show?pid=3379 #include<cstdio> #include<iostream> ...
- 【题解】洛谷P4180 [BJWC2010] 严格次小生成树(最小生成树+倍增求LCA)
洛谷P4180:https://www.luogu.org/problemnew/show/P4180 前言 这可以说是本蒟蒻打过最长的代码了 思路 先求出此图中的最小生成树 权值为tot 我们称这棵 ...
- 倍增求LCA学习笔记(洛谷 P3379 【模板】最近公共祖先(LCA))
倍增求\(LCA\) 倍增基础 从字面意思理解,倍增就是"成倍增长". 一般地,此处的增长并非线性地翻倍,而是在预处理时处理长度为\(2^n(n\in \mathbb{N}^+)\ ...
- 树链剖分与倍增求LCA
树链剖分与倍增求\(LCA\) 首先我要吐槽机房的辣基供电情况,我之前写了一上午,马上就要完成的时候突然停电,然后\(GG\)成了送链剖分 其次,我没歧视\(tarjan LCA\) 1.倍增求\(L ...
- [学习笔记] 树上倍增求LCA
倍增这种东西,听起来挺高级,其实功能还没有线段树强大.线段树支持修改.查询,而倍增却不能支持修改,但是代码比线段树简单得多,而且当倍增这种思想被应用到树上时,它的价值就跟坐火箭一样,噌噌噌地往上涨. ...
随机推荐
- 【python-opencv】19-Canny边缘检测
Canny 边缘提取的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是: 好的检测- 算法能够尽可能多地标识出图像中的实际边缘. 好的定位- 标识出的边缘要尽可能与实际图像中的实际边缘尽可能接近 ...
- Django单元测试简单示例
对一个功能的验证往往是需要很多多测试用例,可以把测试用例集合在一起执行,这就产生了测试套件TestSuite 的概念,它是用来组装单个测试用例,规定用例的执行的顺序,而且TestSuite也可以嵌套T ...
- 修改mac地址(物理地址)
查询原有的MAC地址(物理地址) cmd ipconfig /all 修改MAC地址(物理地址) 修改MAC地址后,再查看MAC地址: cmd ipconfig /all 修改成功.
- 如何在 vue 项目里正确地引用 jquery 和 jquery-ui的插件
copy内容的网址: https://segmentfault.com/a/1190000007020623 使用vue-cli构建的vue项目,webpack的配置文件是分散在很多地方的,而我们需要 ...
- Tomcat清空缓存方法
把Tomcat的work目录下有个Catalina全部删除
- 什么是anaconda【转载】
转自:https://zhidao.baidu.com/question/525102108723657245.html https://zhidao.baidu.com/question/62475 ...
- Jquery map()
<!DOCTYPE html> <html> <head> <style>p { color:red; }</style> <scri ...
- 安插,复制,替换和删除ul中的li
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- IDA 7.0在Mojava更新后打不开的问题
Mac升级到mojava后,ida 7.0打不开了. 上述是两种典型的窗口,不过不论是出现什么样的弹窗,如果是在升级之后出现的,都要试一下下面的解决办法.因为IDA7.0版本流出的比较多,虽然这个已经 ...
- Fortran入门:Windows平台的Fortran编译器安装和使用
因为课程需要,今年开始学习FORTRAN语言.之前学校的计算概论用的是C,后来又学了C++和Python作为面向对象的工具,数值计算方面主要通过学校的许可证用的MATLAB.因为专业侧重数值模拟和反演 ...