树上倍增 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 & ...
随机推荐
- vue-cesium中经纬度写反了,报错
vue-cesium中经纬度写反了,报错 [Vue warn]: Invalid prop: custom validator check failed for prop "position ...
- 递归中,调用forEach方法问题
1 function traverse(objNmae,obj,url){ url = url || objNmae; if(typeof obj === "object" ){ ...
- 实用maven笔记三-仓库
maven管理依赖的一个很重要的基础在于,其维护了收集大量依赖jar包的仓库. maven的仓库分类为本地仓库和远程仓库. 构件在仓库的路径大致为:groupId/artifactId/version ...
- 关于JS递归函数求斐波那契数列两种实现方法
百度已经解释的很详细了,但是不写注释还真是看不懂,递归,就直接套公式了,for循坏,我们就用EXCEL看一下规律 可以看到B是A+B的和,A往后就是B的值,所以我们需要第三个变量来保存他们的和,取出B ...
- javascript中var同时声明多个变量时的原理是什么?
<script> function show(){ var a=b=c=d=5; } show(); alert(a);//弹a时报错(not defined),而b.c.d都能弹出5 & ...
- 解决HDFS小文件带来的计算问题
hive优化 一.小文件简述 1.1. HDFS上什么是小文件? HDFS存储文件时的最小单元叫做Block,Hadoop1.x时期Block大小为64MB,Hadoop2.x时期Block大小为12 ...
- shell位置参数和 shift 命令
- 单实例安装elastic和启动报错解决
下载 先到官网https://www.elastic.co/cn/downloads/past-releases/elasticsearch-5-5-2下载,我安装的是5.5.2的版本,其他版本直接访 ...
- ANdroid手机屏幕反横向等参数设定
经过我一番百度和看Android文档,我才发现,Android对旋转屏,特别是只有横屏或者竖屏虽重力旋转的支持是到Android4.3.1才有完美支持的 unspecified - 默认值,由系统选择 ...
- androidstudio 2.3.3 jni过程汇总(2):2、使用so文件
2.使用so文件 1.在java文件中System.loadLibrary加载包,并且引入native方法. 2.在app/src/main/下新建jniLibs文件夹,将so包带arm文件夹形式导入 ...