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
倍增这种东西,听起来挺高级,其实功能还没有线段树强大.线段树支持修改.查询,而倍增却不能支持修改,但是代码比线段树简单得多,而且当倍增这种思想被应用到树上时,它的价值就跟坐火箭一样,噌噌噌地往上涨. ...
随机推荐
- (四)Web应用开发---系统架构图
系统宏观架构:EASYUI+MVC 系统架构图一. 系统架构图二.
- LINUX中的ACL
一. 为什么要使用ACL先让我们来简单地复习一下Linux的文件权限. 在 linux下,对一个文件(或者资源)可以进行操作的对象被分为三类: file owner(文件 的拥有者),group(组, ...
- java计算器 图形用户界面 升级版 v1.02
package com.rgy.entity; import java.awt.BorderLayout; import java.awt.Font; import java.awt.GridLayo ...
- win10 问题:你没有权限在此位置中保存文件。请与管理员联系以获得相应权限。
https://jingyan.baidu.com/album/b24f6c8207f09886bee5da4a.html?picindex=2 归根结底就是通过点击文件夹的属性,在安全选项处,修改操 ...
- 实习培训——Java基础(1)
实习培训——Java基础(1) 1.我的第一个JAVA程序 首先好配置好JDK环境,百度上有很多.创建文件HelloWorld.java(文件名与类名相同),代码如下: public class He ...
- CentOS忘记普通用户密码解决办法
普通用户忘记密码 1.使用root用户登录系统,找到/etc/shadow文件. 2.找到用户名开头的那一行,例如我的用户名为pds,,以冒号为分割符,红色部分是密码加密部分 pds:$1$Civop ...
- Android APP安装后不在桌面显示图标的应用场景举例和实现方法
最近在为公司做一款车联网的产品,由于公司本身擅长于汽车解码器的研发,所以该产品的诊断功能的实现除了使用目前市面上车联网产品中大量使用的OBD协议外,还会使用一些专车专用协议去实现一些特殊的诊断功能,如 ...
- iOS 网易彩票-1框架搭建
仿网易彩票,最终要做成的效果如下: 一.分层搭建 1.新建一个项目,Lottery.只支持7.1以上坚屏. 2.将素材全部图片全部拉到相应的文件夹里. 3.选中Lottery--右键Show in F ...
- JS中的对象数组
<html> <head> <title>对象数组的字符串表示</title> <script type="text/javascrip ...
- C#--virtual,abstract,override,new,sealed修饰符学习
1.参考博客 http://www.cnblogs.com/oneword/archive/2009/07/02/1515279.html http://www.cnblogs.com/mygood ...