树上倍增 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 & ...
随机推荐
- Loadrunner test web service which need username and password
Action(){ char * position; char * str; int offset; char * search_str = "ERROR"; // web_s ...
- MySQL全面优化,速度飞起来!
Java技术栈 www.javastack.cn 优秀的Java技术公众号 作者:惨绿少年 https://www.cnblogs.com/clsn/p/8214048.html 在进行MySQL的优 ...
- Spring import配置文件使用占位符
import使用占位符 连接池切换导入配置的代码: <import resource="classpath:META-INF/spring/spring-${db.connection ...
- SQL中to_char方法的应用
1.取得当前日期是本月的第几周 SQL> select to_char(sysdate,'YYYYMMDD W HH24:MI:SS') from dual; ----------------- ...
- Json解析之FastJson
版权声明:转载请注明出处 https://blog.csdn.net/heqiangflytosky/article/details/37659943 1.FastJson介绍 FastJson是阿里 ...
- 分布式-技术专区-Redis并发竞争key的解决方案详解
Redis缓存的高性能有目共睹,应用的场景也是非常广泛,但是在高并发的场景下,也会出现问题:缓存击穿.缓存雪崩.缓存和数据一致性,以及今天要谈到的缓存并发竞争.这里的并发指的是多个redis的clie ...
- WPF 动态添加控件以及样式字典的引用(Style introduction)
原文:WPF 动态添加控件以及样式字典的引用(Style introduction) 我们想要达到的结果是,绑定多个Checkbox然后我们还可以获取它是否被选中,其实很简单,我们只要找到那几个关键的 ...
- 前端学习(二十一)初识h5(笔记)
html5 主要目标:语义化!可以被人或者机器更好的阅读! 支持各种媒体的嵌入!不兼容低版本!------------ html5新标签: 普通: <header clas ...
- 57. Collections(list的工具类)、Arrays(数组的工具类)
List集合的工具类(Collections): 注意:Collection是单列集合的根接口 Collections是操作集合对象的工具类 1.对list集合排序: sort(List) 根据自然 ...
- getElementsBy 系列方法相比querySelector系列的区别
最近在做的项目中,使用querySelectorAll获取了同class名的元素后,绑定onmouseover事件和onmouseout后,多次在几个元素上移入移出操作时,控制台出现了报错的问题,最后 ...