倍增法加了边的权值,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*2];
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]=0;depth[root]=0;fa[root][0]=root;que.push(root);while(!que.empty()){int tmp=que.front();que.pop();for(int i=1;i<DEG;i++)fa[tmp][i]=fa[fa[tmp][i-1]][i-1];for(int i=head[tmp];i!=-1;i=edge[i].next){int v=edge[i].to;if(v==fa[tmp][0])continue;deg[v]=deg[tmp]+1;depth[v]=depth[tmp]+edge[i].w;fa[v][0]=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=0;det;det>>=1,i++)if(det&1) tv=fa[tv][i];if(tu==tv) return tu;for(int i=DEG-1;i>=0;i--){if(fa[tu][i]==fa[tv][i]) continue;tu=fa[tu][i];tv=fa[tv][i];}return fa[tu][0];
}
void init(){tot=0;memset(flag,0,sizeof flag);memset(head,-1,sizeof head);memset(deg,0,sizeof deg);memset(depth,0,sizeof depth);
}
int main(){int T,n,q,u,v,w;cin >> T;while(T--){init();scanf("%d%d",&n,&q);for(int i=1;i<n;i++){scanf("%d%d%d",&u,&v,&w);addedge(u,v,w);addedge(v,u,w);flag[v]=1;}int root;for(int i=1;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]-2*depth[tmp]);}}return 0;
}

转载于:https://www.cnblogs.com/zsben991126/p/10015363.html

hdu2586 lca倍增法相关推荐

  1. 01分数规划c语言,POJ 1330(LCA/倍增法模板)

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

  2. LCA倍增法 求树的最近公共祖先(模板)

    LCA倍增法 求树的最近公共祖先 查询树上任意两个节点之间的路径信息,实际上就是找这两个节点的LCA,因为唯一路径就是这两个节点分别到LCA会合,所以关键问题就是求LCA,需要的路径信息可在找LCA过 ...

  3. poj 1470(简单LCA 倍增法)

    题意:给你一个树,有若干个询问,然后让你统计每个结点在询问中做了几次LCA.按照结点顺序输出. 思路:这也是简单的LCA题目,我用的是倍增法.每次查询在相应结点标记上++,最后输出即可.这道题的输入处 ...

  4. poj1470 LCA倍增法

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

  5. [算法总结] LCA倍增法 dfs

    目录 步骤 模板 题目 步骤 预处理 出 每个的2^j 的祖先 将两个点 移到同一位置 倍增从大到小的跳跃 模板 #include <iostream> #include <vect ...

  6. LCA(倍增+Tarjan)和BFS、DFS以及Prim、Kruskal

    文章目录 LCA 倍增 并查集 题目背景 题目描述 输入格式 输出格式 输入输出样例 Tarjan算法 LCA和倍增 LCA和Tarjan 深度优先搜索 广搜BFS 最小生成树 普里姆算法(找点) 克 ...

  7. 树上倍增法求最近公共祖先LCA

    LCA,最近公共祖先,这个东西有很多作用,因此,如何高效求出LCA就成了一个热点的讨论话题. 下面所有的讨论都以图中这棵树为例子. 先来了解下什么是倍增吧,倍增其实就是二分的逆向,二分是逐渐缩小范围, ...

  8. (转)LCA模板(倍增法)

    插眼:点击查看 用法:求树上两个节点的公共祖先 代码: const int N=1e5+100;int n;//节点个数int k=log2(n)+1;int dp[N][20];//倍增法int d ...

  9. LCA问题(倍增法)

    之前写过了LCA的两个在线算法之一:DFS+ST方法(DFS+ST).本篇介绍另一种在线算法,用倍增思想来解决LCA问题.在学习倍增之前,先看一种倍增算法的退化版,有助于理解倍增法. 在找a和b的LC ...

  10. 图论--LCA--树上倍增法(在线)

    /** LCA在线算法(倍增法) */ const int MAXN = 10010; const int DEG = 20;struct Edge {int to, next; } edge[MAX ...

最新文章

  1. ASP.NET MVC 2
  2. MDP 笔记:Value Iteration
  3. 入门Web前端要注意什么?要学哪些软件?
  4. python可以实现的小游戏_今天教小白用Python实现一款小游戏!最适合装逼的神技!亲测可用...
  5. [转]js中escape,encodeURI,encodeURIComponent三个函数的区别
  6. 一口气说出8种幂等性解决重复提交的方案,面试官懵了!(附代码)
  7. Python 格式化字符串f-string概览(转载)
  8. LeetCode4 寻找两个正序数组的中位数
  9. 设计模式学习笔记——状态模式(state)
  10. 分布式计算、统计学习与ADMM算法
  11. python基本代码教学_如何真正零基础入门Python?(第一节)
  12. Android Studio安装和使用教程(全文图解)
  13. 彩虹代刷网免授权+精美WAP端源码
  14. 学习Java的第五天 | 定义方法 | 引用数据类型——类 | 访问权限-修饰符 | 全局变量与局部变量 | toString | 构造方法 | 方法重载
  15. 使用Dreamweaver MX制作基础简易6行8列个人简历表格。
  16. 新一代苹果手机越来越明朗?新iPhone泄露零件组装
  17. 帝国cms内容页php获取当前栏目名,帝国CMS获取当前页面顶级栏目名称和连接的方法...
  18. CSU - 2135 Appositive Body
  19. hp服务器系统检测,HP服务器检测步骤-20210621132835.docx-原创力文档
  20. char*cstr 转 ushort

热门文章

  1. JVM监控及诊断工具命令行篇之jcmd
  2. Nacos集群(二)阿里自研弱一致性Distro协议核心实现
  3. leetcode-896-单调数列
  4. idea 错误: -source 1.6 中不支持 diamond 运算符的解决办法
  5. ember.js 101 入门教程 第一课
  6. Windows server 2008计划任务(批处理命令)不执行
  7. Android文件资源(raw/data/asset)的存取
  8. 学技术的不能自废武功
  9. startActivityForResult调用后立即响应了OnActivityResult()方法,导致setResult()后无响应
  10. php如何取屏幕大小,JavaScript_JS获取当前网页大小以及屏幕分辨率等,效果如下:代码如下:- phpStudy...