hdu2586 lca倍增法
倍增法加了边的权值,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倍增法相关推荐
- 01分数规划c语言,POJ 1330(LCA/倍增法模板)
链接:http://poj.org/problem?id=1330 题意:q次询问求两个点u,v的LCA 思路:LCA模板题,首先找一下树的根,然后dfs预处理求LCA(u,v) AC代码: #inc ...
- LCA倍增法 求树的最近公共祖先(模板)
LCA倍增法 求树的最近公共祖先 查询树上任意两个节点之间的路径信息,实际上就是找这两个节点的LCA,因为唯一路径就是这两个节点分别到LCA会合,所以关键问题就是求LCA,需要的路径信息可在找LCA过 ...
- poj 1470(简单LCA 倍增法)
题意:给你一个树,有若干个询问,然后让你统计每个结点在询问中做了几次LCA.按照结点顺序输出. 思路:这也是简单的LCA题目,我用的是倍增法.每次查询在相应结点标记上++,最后输出即可.这道题的输入处 ...
- poj1470 LCA倍增法
倍增法模板题 #include<iostream> #include<cstring> #include<cstdio> #include<queue> ...
- [算法总结] LCA倍增法 dfs
目录 步骤 模板 题目 步骤 预处理 出 每个的2^j 的祖先 将两个点 移到同一位置 倍增从大到小的跳跃 模板 #include <iostream> #include <vect ...
- LCA(倍增+Tarjan)和BFS、DFS以及Prim、Kruskal
文章目录 LCA 倍增 并查集 题目背景 题目描述 输入格式 输出格式 输入输出样例 Tarjan算法 LCA和倍增 LCA和Tarjan 深度优先搜索 广搜BFS 最小生成树 普里姆算法(找点) 克 ...
- 树上倍增法求最近公共祖先LCA
LCA,最近公共祖先,这个东西有很多作用,因此,如何高效求出LCA就成了一个热点的讨论话题. 下面所有的讨论都以图中这棵树为例子. 先来了解下什么是倍增吧,倍增其实就是二分的逆向,二分是逐渐缩小范围, ...
- (转)LCA模板(倍增法)
插眼:点击查看 用法:求树上两个节点的公共祖先 代码: const int N=1e5+100;int n;//节点个数int k=log2(n)+1;int dp[N][20];//倍增法int d ...
- LCA问题(倍增法)
之前写过了LCA的两个在线算法之一:DFS+ST方法(DFS+ST).本篇介绍另一种在线算法,用倍增思想来解决LCA问题.在学习倍增之前,先看一种倍增算法的退化版,有助于理解倍增法. 在找a和b的LC ...
- 图论--LCA--树上倍增法(在线)
/** LCA在线算法(倍增法) */ const int MAXN = 10010; const int DEG = 20;struct Edge {int to, next; } edge[MAX ...
最新文章
- ASP.NET MVC 2
- MDP 笔记:Value Iteration
- 入门Web前端要注意什么?要学哪些软件?
- python可以实现的小游戏_今天教小白用Python实现一款小游戏!最适合装逼的神技!亲测可用...
- [转]js中escape,encodeURI,encodeURIComponent三个函数的区别
- 一口气说出8种幂等性解决重复提交的方案,面试官懵了!(附代码)
- Python 格式化字符串f-string概览(转载)
- LeetCode4 寻找两个正序数组的中位数
- 设计模式学习笔记——状态模式(state)
- 分布式计算、统计学习与ADMM算法
- python基本代码教学_如何真正零基础入门Python?(第一节)
- Android Studio安装和使用教程(全文图解)
- 彩虹代刷网免授权+精美WAP端源码
- 学习Java的第五天 | 定义方法 | 引用数据类型——类 | 访问权限-修饰符 | 全局变量与局部变量 | toString | 构造方法 | 方法重载
- 使用Dreamweaver MX制作基础简易6行8列个人简历表格。
- 新一代苹果手机越来越明朗?新iPhone泄露零件组装
- 帝国cms内容页php获取当前栏目名,帝国CMS获取当前页面顶级栏目名称和连接的方法...
- CSU - 2135 Appositive Body
- hp服务器系统检测,HP服务器检测步骤-20210621132835.docx-原创力文档
- char*cstr 转 ushort
热门文章
- JVM监控及诊断工具命令行篇之jcmd
- Nacos集群(二)阿里自研弱一致性Distro协议核心实现
- leetcode-896-单调数列
- idea 错误: -source 1.6 中不支持 diamond 运算符的解决办法
- ember.js 101 入门教程 第一课
- Windows server 2008计划任务(批处理命令)不执行
- Android文件资源(raw/data/asset)的存取
- 学技术的不能自废武功
- startActivityForResult调用后立即响应了OnActivityResult()方法,导致setResult()后无响应
- php如何取屏幕大小,JavaScript_JS获取当前网页大小以及屏幕分辨率等,效果如下:代码如下:- phpStudy...