倍增求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的更多相关文章

  1. hdu 2586 欧拉序+rmq 求lca

    题意:求树上任意两点的距离 先说下欧拉序 对这颗树来说 欧拉序为 ABDBEGBACFHFCA 那欧拉序有啥用 这里先说第一个作用 求lca 对于一个欧拉序列,我们要求的两个点在欧拉序中的第一个位置之 ...

  2. 树上倍增求LCA(最近公共祖先)

    前几天做faebdc学长出的模拟题,第三题最后要倍增来优化,在学长的讲解下,尝试的学习和编了一下倍增求LCA(我能说我其他方法也大会吗?..) 倍增求LCA: father[i][j]表示节点i往上跳 ...

  3. [算法]树上倍增求LCA

    LCA指的是最近公共祖先(Least Common Ancestors),如下图所示: 4和5的LCA就是2 那怎么求呢?最粗暴的方法就是先dfs一次,处理出每个点的深度 然后把深度更深的那一个点(4 ...

  4. 【倍增】洛谷P3379 倍增求LCA

    题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...

  5. 倍增求lca模板

    倍增求lca模板 https://www.luogu.org/problem/show?pid=3379 #include<cstdio> #include<iostream> ...

  6. 【题解】洛谷P4180 [BJWC2010] 严格次小生成树(最小生成树+倍增求LCA)

    洛谷P4180:https://www.luogu.org/problemnew/show/P4180 前言 这可以说是本蒟蒻打过最长的代码了 思路 先求出此图中的最小生成树 权值为tot 我们称这棵 ...

  7. 倍增求LCA学习笔记(洛谷 P3379 【模板】最近公共祖先(LCA))

    倍增求\(LCA\) 倍增基础 从字面意思理解,倍增就是"成倍增长". 一般地,此处的增长并非线性地翻倍,而是在预处理时处理长度为\(2^n(n\in \mathbb{N}^+)\ ...

  8. 树链剖分与倍增求LCA

    树链剖分与倍增求\(LCA\) 首先我要吐槽机房的辣基供电情况,我之前写了一上午,马上就要完成的时候突然停电,然后\(GG\)成了送链剖分 其次,我没歧视\(tarjan LCA\) 1.倍增求\(L ...

  9. [学习笔记] 树上倍增求LCA

    倍增这种东西,听起来挺高级,其实功能还没有线段树强大.线段树支持修改.查询,而倍增却不能支持修改,但是代码比线段树简单得多,而且当倍增这种思想被应用到树上时,它的价值就跟坐火箭一样,噌噌噌地往上涨. ...

随机推荐

  1. atitit. orm框架的hibernate 使用SQLQuery createSQLQuery addEntity

    atitit. orm框架的hibernate 使用SQLQuery createSQLQuery addEntity 1. addEntity 对原生SQL查询运行的控制是通过SQLQuery接口进 ...

  2. form表单的enctype属性

    ①application/x-www-form-urlencoded : 数据被编码为名称/值对. ②multipart/form-data : 数据被编码为一条消息,页上的每个控件对应消息中的一个部 ...

  3. requests的post请求:百度翻译

    import json import requests class Trans(object): def __init__(self, juzi): self.juzi = juzi self.bas ...

  4. jquery实现选项卡(两句即可实现)

    <!DOCTYPE HTML><html> <head>        <meta charset="utf-8">         ...

  5. sql server字符串中怎么添加换行?

    换行/回车,可以使用CHAR函数处理,比如: 1 insert into tbtest (text) values ('abc' + char(13)+char(10) + 'def') 主要还是要看 ...

  6. python 基础 列表生成式 生成器

    列表生成式 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式 举个例子,要生成list [1, 2, 3, 4, 5, 6, 7, ...

  7. android 打开系统相机,

    1.第一步在androidmanifest.xml中注册 <uses-permission android:name="android.permission.WRITE_EXTERNA ...

  8. Linux(CentOS)安装Mysql数据库

    1.需要mysql-linux安装包 本次使用mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz进行安装   2.将此安装包上传至linux服务器 上传路径为:/usr ...

  9. JS在不同js文件中互相调用

    例如有这样一个html,里面有一个按钮,当按下时调用b.js文件中的方法b().而b()中又要调用a.js文件中的方法a().若要实现这个功能,必须注意,将要引入的Js文件代码放在</body& ...

  10. ftp.GetResponse() 无法连接到远程服务器

    最近在做一个ftp上传下载以及在服务器上创建文件夹的工具 报 GetResponse() 无法连接到远程服务器  错误 明明 ip , 账户和 密码 用ftp 工具都能连接上 ,可是 代码就不行了,看 ...