树上倍增 hdu 2586
代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<string.h>
using namespace std;
const int max_=8e4+;
int depth[max_];//节点深度
int gw[max_][];//第 i 点到2^j父亲的距离
int fa[max_][];//第 i 点的2^j父亲
bool vis[max_];//标记数组
int tot,N;
struct Tree//树
{
int to;
int w;
int next;
}a[max_*];
int edge[max_*];
void add_edge(int x,int y,int w)//建树
{
a[tot].to=y;
a[tot].w=w;
a[tot].next=edge[x];
edge[x]=tot++;
}
void dfs(int now,int deep)//dfs预处理
{
if(vis[now]==)
{
vis[now]=;
depth[now]=deep;//记录节点的深度
}
for(int i=edge[now];i!=-;i=a[i].next)
{
int to=a[i].to;
if(vis[to])
continue;
int w=a[i].w;
gw[to][]=w;//to到父亲的距离
fa[to][]=now;//to的父亲节点
dfs(to,deep+);
}
}
void LCA_init(int n)//预处理
{
for(int i=;i<=n;i++)
for(int j=;j<=N;j++)
{
fa[i][j]=fa[fa[i][j-]][j-];
gw[i][j]=gw[fa[i][j-]][j-]+gw[i][j-];
}
}
int LCA_Q(int u,int v)
{
int ans=;//距离
if(depth[u]<depth[v])
swap(u,v);//保证大减小
int k;
k=depth[u]-depth[v];
for(int i=;(<<i)<=k;i++)
{
if((<<i)&k)
ans+=gw[u][i],u=fa[u][i];
}
if(u==v)
return ans;//找到了就退出
for(int i=N;i>=;i--)
{
if(fa[u][i]!=fa[v][i])
{
ans+=gw[u][i],
ans+=gw[v][i];
u=fa[u][i],
v=fa[v][i];
}
}
return ans+=gw[v][]+gw[u][];
}
void init(int n)//初始化
{
memset(vis,,sizeof(vis));
tot=;
N=(int)(log(n+0.0)/log());
memset(edge,-,sizeof(edge));
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n,m;
scanf("%d %d",&n,&m);
init(n);
for(int i=;i<n-;i++)
{
int u,v,w;
scanf("%d %d %d",&u,&v,&w);
add_edge(u,v,w);
add_edge(v,u,w);
}
dfs(,);
LCA_init(n);
while(m--)
{
int u,v;
scanf("%d %d",&u,&v);
int L=LCA_Q(u,v);
printf("%d\n",L);
}
/* for(int i=1;i<=n;i++)
printf("%d ",fa[i][2]);*/
}
}
/*
13 2
1 2 1
1 3 1
1 4 1
2 5 1
3 6 1
6 10 1
6 11 1
10 13 1
4 7 1
4 8 1
4 9 1
8 12 1
*/
/* for(int x=max0;x>=0;x--) //注意!此处循环必须是从大到小!因为我们应该越提越“精确”,
if(fa[u][x]!=fa[v][x]) //如果从小到大的话就有可能无法提到正确位置,自己可以多想一下
{
u=fa[u][x];
v=fa[v][x];
}
return fa[u][0]; //此时u、v的第一个父亲就是LCA。*/
树上倍增 hdu 2586的更多相关文章
- HDU 4822 Tri-war(LCA树上倍增)(2013 Asia Regional Changchun)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4822 Problem Description Three countries, Red, Yellow ...
- hdu 2586 How far away ?倍增LCA
hdu 2586 How far away ?倍增LCA 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2586 思路: 针对询问次数多的时候,采取倍增 ...
- hdu 2586 How far away
How far away ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- 树上倍增求LCA及例题
先瞎扯几句 树上倍增的经典应用是求两个节点的LCA 当然它的作用不仅限于求LCA,还可以维护节点的很多信息 求LCA的方法除了倍增之外,还有树链剖分.离线tarjan ,这两种日后再讲(众人:其实是你 ...
- 洛谷P3379lca,HDU2586,洛谷P1967货车运输,倍增lca,树上倍增
倍增lca板子洛谷P3379 #include<cstdio> struct E { int to,next; }e[]; ],anc[][],log2n,deep[],n,m,s,ne; ...
- LCA(最近公共祖先)--tarjan离线算法 hdu 2586
HDU 2586 How far away ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
- Codevs 2370 小机房的树 LCA 树上倍增
题目描述 Description 小机房有棵焕狗种的树,树上有N个节点,节点标号为0到N-1,有两只虫子名叫飘狗和大吉狗,分居在两个不同的节点上.有一天,他们想爬到一个节点上去搞基,但是作为两只虫子, ...
- NOIP2013 货车运输 (最大生成树+树上倍增LCA)
死磕一道题,中间发现倍增还是掌握的不熟 ,而且深刻理解:SB错误毁一生,憋了近2个小时才调对,不过还好一遍AC省了更多的事,不然我一定会疯掉的... 3287 货车运输 2013年NOIP全国联赛提高 ...
- HDU - 2586 How far away ?(LCA模板题)
HDU - 2586 How far away ? Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I64d & ...
随机推荐
- python学习笔记:模块——自定义模块的3种导入方式
一.定义 模块就是用一堆的代码实现了一些功能的代码的集合,通常一个或者多个函数写在一个.py文件里,而如果有些功能实现起来很复杂,那么就需要创建n个.py文件,这n个.py文件的集合就是模块.如果不懂 ...
- Catch and Buffer
通常人们所说的Cache就是指缓存SRAM. SRAM叫静态内存,“静态”指的是当我们将一笔数据写入SRAM后,除非重新写入新数据或关闭电源,否则写入的数据保持不变. 由于CPU的速度比内存和硬盘的速 ...
- sql server 与 oracle的区别(转)
--1.数据类型不同. --sql server 的数据类型:int ,smallint ,char,varchar,nchar,nvarchar,ntext,datetime,smalld ...
- Android apiDemo 学习——对话框AlertDialogSamples
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/zpf8861/article/details/31423049 注意:该代码仅仅适用于当次简单调用对 ...
- React 16.4 生命周期
补一下 React 16.4版本的生命周期图
- koa2实现登录注册功能(ejs+mongodb版)
gtihub仓库地址:(由于国内处于敏感时期,github暂时无法访问) 主要使用的中间件: "ejs": "^2.7.1",(渲染模板) "koa& ...
- 【mysql升级步骤】windows mysql版本升级 ,mysql 5.6 升级到5.7.27
最近博主由于工作原因需要把之前安装好的的mysql 5.6.44版本卸载,然后安装mysql 5.7.*版本. 前提:为什么要升级到5.7版本? 因为博主在5.6版本上执行脚本时候报出异常:to yo ...
- linux 命令 - man, help, info(查看命令帮助手册)
man, help, info - 查看命令帮助手册 help xxx # 显示内置命令帮助信息: xxx --help # 显示外置命令帮助信息: man xxx # 没有内建与外部命令的 ...
- ORA-01000 error
ORA-01000是最大开放游标错误,是Oracle数据库开发中极为常见的错误. 在Java的上下文中,当应用程序尝试打开更多ResultSet而不是数据库实例上的已配置游标时,会发生这种情况. 解决 ...
- dubbo-源码阅读之Filter默认实现
SPI配置的默认实现 cache=com.alibaba.dubbo.cache.filter.CacheFilter validation=com.alibaba.dubbo.validation. ...