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
倍增这种东西,听起来挺高级,其实功能还没有线段树强大.线段树支持修改.查询,而倍增却不能支持修改,但是代码比线段树简单得多,而且当倍增这种思想被应用到树上时,它的价值就跟坐火箭一样,噌噌噌地往上涨. ...
随机推荐
- 洛谷P1903 数颜色 [国家集训队] 莫队
正解:带修莫队 解题报告: 可以理解为引入时间参数,然后就是有了仨参数,关于这个修改同样的是,如果时间是相同的,不用搞,如果时间不相同做一下时光倒流/时光推移就成嘛 但是肯定既然这样的话,按照原来的s ...
- Git Gui 查看分支历史的时候中文显示乱码
如图所示 解决方案1 在Git Gui工具栏上选择-编辑-选项: 选择:Default File Contents Encoding, change为UTF-8 成功: 解决方案2 C:\Users ...
- vue-preview使用
1.安装 npm i vue-preview -S2.如果使用vue-cli生成的项目,需要修改webpack.base.conf.js文件中的loaders,添加一个loader{ test:/vu ...
- Spring boot Security 用于权限管理,用户添加等。
1:添加依赖: <dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thy ...
- Thread类的常见问题
void waitForSignal() { Object obj = new Object(); synchronized(Thread.currentThread()) { obj.wait(); ...
- [py][mx]django-解决注册用户已存在,激活链接判断
注册时候,如果用户已存在,则提示错误 激活用户时候,如果激活链接失效,则提示用户. class RegisterView(View): def get(self, request): register ...
- Python中的类属性、实例属性与类方法、静态方法
1.什么是类对象,实例对象 类对象:类名 实例对象:类创建的对象 2.类属性就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本,这个和C++.Java中类的静态成员变量有点 ...
- c++多态特性总结
将父类比喻为电脑的外设接口,子类比喻为外设,现在我有移动硬盘.U盘以及MP3,它们3个都是可以作为存储但是也各不相同.如果我在写驱动的时候,我用个父类表示外设接口,然后在子类中重写父类那个读取设备的虚 ...
- iOS UI基础-4.1应用程序管理 字典转Model
用模型取代字典 使用字典的坏处 一般情况下,设置数据和取出数据都使用“字符串类型的key”,编写这些key时,编辑器没有智能提示,需要手敲 dict[@"name"] = @&qu ...
- tfs使用流程
1.用邮箱注册个微软账号,如zhangsan@outlook.com等邮箱 2.管理员会添加此用户zhangsan@outlook.com 3.打开vs,team-tfs-connect to ser ...