倍增法加了边的权值,bfs的时候顺便把每个点深度求出来即可

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
#define maxn 40005
#define DEG 20
struct Edge{
int to,next,w;
}edge[maxn*];
int head[maxn],tot;
void addedge(int u,int v,int w){
edge[tot].to=v;
edge[tot].next=head[u];
edge[tot].w=w;
head[u]=tot++;
}
int fa[maxn][DEG];
int deg[maxn],depth[maxn];
int flag[maxn];
void bfs(int root){
queue<int> que;
deg[root]=;depth[root]=;
fa[root][]=root;
que.push(root);
while(!que.empty()){
int tmp=que.front();que.pop();
for(int i=;i<DEG;i++)
fa[tmp][i]=fa[fa[tmp][i-]][i-];
for(int i=head[tmp];i!=-;i=edge[i].next){
int v=edge[i].to;
if(v==fa[tmp][])continue;
deg[v]=deg[tmp]+;
depth[v]=depth[tmp]+edge[i].w;
fa[v][]=tmp;
que.push(v);
}
}
}
int lca(int u,int v){
if(deg[u]>deg[v]) swap(u,v);
int hu=deg[u],hv=deg[v],tu=u,tv=v;
for(int det=hv-hu,i=;det;det>>=,i++)
if(det&) tv=fa[tv][i];
if(tu==tv) return tu;
for(int i=DEG-;i>=;i--){
if(fa[tu][i]==fa[tv][i]) continue;
tu=fa[tu][i];tv=fa[tv][i];
}
return fa[tu][];
}
void init(){
tot=;
memset(flag,,sizeof flag);
memset(head,-,sizeof head);
memset(deg,,sizeof deg);
memset(depth,,sizeof depth);
}
int main(){
int T,n,q,u,v,w;
cin >> T;
while(T--){
init();
scanf("%d%d",&n,&q);
for(int i=;i<n;i++){
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
addedge(v,u,w);
flag[v]=;
}
int root;
for(int i=;i<=n;i++) if(!flag[i]){root=i;break;}
bfs(root); while(q--){
scanf("%d%d",&u,&v);
int tmp=lca(u,v);
printf("%d\n",depth[u]+depth[v]-*depth[tmp]);
}
}
return ;
}

hdu2586 lca倍增法的更多相关文章

  1. LCA(最近公共祖先)——LCA倍增法

    一.前人种树 博客:最近公共祖先 LCA 倍增法 博客:浅谈倍增法求LCA 二.沙场练兵 题目:POJ 1330 Nearest Common Ancestors 代码: const int MAXN ...

  2. POJ - 1330 Nearest Common Ancestors(dfs+ST在线算法|LCA倍增法)

    1.输入树中的节点数N,输入树中的N-1条边.最后输入2个点,输出它们的最近公共祖先. 2.裸的最近公共祖先. 3. dfs+ST在线算法: /* LCA(POJ 1330) 在线算法 DFS+ST ...

  3. poj1470 LCA倍增法

    倍增法模板题 #include<iostream> #include<cstring> #include<cstdio> #include<queue> ...

  4. 最近公共祖先 LCA 倍增法

    [简介] 解决LCA问题的倍增法是一种基于倍增思想的在线算法. [原理] 原理和同样是使用倍增思想的RMQ-ST 算法类似,比较简单,想清楚后很容易实现. 对于每个节点u , ancestors[u] ...

  5. luogu3379 【模板】最近公共祖先(LCA) 倍增法

    题目大意:给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 整体步骤:1.使两个点深度相同:2.使两个点相同. 这两个步骤都可用倍增法进行优化.定义每个节点的Elder[i]为该节点的2^k( ...

  6. LCA—倍增法求解

    LCA(Least Common Ancestors) 即最近公共祖先,是指在有根树中,找出某两个结点u和v最近的公共祖先. 常见解法一般有三种 这里讲解一种在线算法-倍增 首先我们定义fa[u][j ...

  7. LCA - 倍增法去求第几个节点

    You are given a tree (an undirected acyclic connected graph) with N nodes, and edges numbered 1, 2, ...

  8. POJ 1330(LCA/倍增法模板)

    链接:http://poj.org/problem?id=1330 题意:q次询问求两个点u,v的LCA 思路:LCA模板题,首先找一下树的根,然后dfs预处理求LCA(u,v) AC代码: #inc ...

  9. 【模板】Lca倍增法

    Codevs 1036 商务旅行 #include<cstdio> #include<cmath> #include<algorithm> using namesp ...

随机推荐

  1. Gulp小记

    安装 总的来说,玩gulp的流程是这样的: 安装nodejs -> 全局安装gulp -> 项目安装gulp以及gulp插件 -> 配置gulpfile.js -> 运行任务 ...

  2. selenium_采集药品数据1_采集第一页表格

    Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...

  3. strace常用参数详解

    strace常用参数详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. strace命令大家应该比我熟悉吧,如果你不知道,呵呵,会可能跟我一样被人说:“我怀疑你是假运维”,不过没关 ...

  4. myisamchk命令修复表操作

    myisamchk命令使用总结 myisamchk实用程序可以用来获得有关你的数据库表的统计信息或检查.修复.优化他们 1.常用于myisamchk的检查选项--information, -i打印所检 ...

  5. Oracle导出数据中的prompt,set feedback 等是什么意思

    prompt 显示后面的提示,相当于一般的操作系统命令echo,输出后面的信息Importing table t_testset feedback off 1.set feedback 有三种方式: ...

  6. liunx必知必会(1)

    一.liunx目录结构: (1)/bin中 - 用户二进制文件 包含二进制可执行文件. 在单用户模式下,你需要使用的常见Linux命令都位于此目录下.系统的所有用户使用的命令都设在这里. (2)/sb ...

  7. JMS的P2P和PUB/SUB区别和应用场景介绍【转】

    完全引用自: https://my.oschina.net/alexgaoyh/blog/338890  解释得非常棒. 1.P2P模型 在P2P模型中,有下列概念: 消息队列(Queue). 发送者 ...

  8. CentOS6.8下MySQL数据库版本信息查看

    方法1:使用mysql -v命令查看: [root@yeebian mysql]# mysql -V mysql Ver 14.14 Distrib 5.1.73, for redhat-linux- ...

  9. bzoj千题计划304:bzoj3676: [Apio2014]回文串(回文自动机)

    https://www.lydsy.com/JudgeOnline/problem.php?id=3676 回文自动机模板题 4年前的APIO如今竟沦为模板,,,╮(╯▽╰)╭,唉 #include& ...

  10. css去除苹果默认样式

    input[type="button"], input[type="submit"], input[type="reset"] { -web ...