HDU 2586 /// tarjan离线求树上两点的LCA
题目大意:
询问一棵树里 u 到 v 的距离
可由 dis[ u到根 ] + dis[ v到根 ] - 2*dis[ lca(u,v) ] 得到
https://blog.csdn.net/csyzcyj/article/details/10051173
#include <bits/stdc++.h>
#define mem(i,j) memset(i,j,sizeof(i))
using namespace std; const int N=, Q=;
struct EDGE { int to, w, nt; }e[N<<], q[Q<<];
int head[N], tot, que[N], pos;
// 题目数据可能有些问题 实际不止200个询问 WA了好多发 :( int fa[N], dis[N], lca[Q];
bool vis[N]; int n, m, U[Q], V[Q]; void init() {
tot=; mem(head,);
pos=; mem(que,);
mem(vis,); mem(dis,);
}
void addE(int u,int v,int w) {
e[tot].to=v, e[tot].w=w;
e[tot].nt=head[u];
head[u]=tot++;
}
void addQ(int u,int v,int w) {
q[pos].to=v, q[pos].w=w;
q[pos].nt=que[u];
que[u]=pos++;
} int getfa(int u) {
if(fa[u]==u) return u;
return fa[u]=getfa(fa[u]);
} void Tarjan(int u) {
fa[u]=u; vis[u]=;
for(int i=head[u];i;i=e[i].nt) {
int v=e[i].to;
if(!vis[v]) {
dis[v]=dis[u]+e[i].w;
Tarjan(v); fa[v]=u;
}
}
for(int i=que[u];i;i=q[i].nt) {
int v=q[i].to;
if(vis[v]) lca[q[i].w]=getfa(v);
}
} int main()
{
int t; scanf("%d",&t);
while(t--) {
scanf("%d%d",&n,&m);
init(); for(int i=;i<n;i++) {
int u,v,w; scanf("%d%d%d",&u,&v,&w);
addE(u,v,w); addE(v,u,w);
}
for(int i=;i<=m;i++) {
scanf("%d%d",&U[i],&V[i]);
addQ(U[i],V[i],i), addQ(V[i],U[i],i);
} Tarjan();
for(int i=;i<=m;i++)
printf("%d\n",dis[U[i]]+dis[V[i]]-*dis[lca[i]]); } return ;
}
HDU 2586 /// tarjan离线求树上两点的LCA的更多相关文章
- HDU 2874 /// tarjan离线求森林里两点的距离
题目大意: 在一个森林里 询问 u v 两点 若不能到达输出 "Not connected" 否则输出两点距离 https://blog.csdn.net/keyboarderqq ...
- 【HDOJ2586】【Tarjan离线求LCA】
http://acm.hdu.edu.cn/showproblem.php?pid=2586 How far away ? Time Limit: 2000/1000 MS (Java/Others) ...
- cogs 2450. 距离 树链剖分求LCA最近公共祖先 快速求树上两点距离 详细讲解 带注释!
2450. 距离 ★★ 输入文件:distance.in 输出文件:distance.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] 在一个村子里有N个房子,一 ...
- Codeforces Round #620 (Div. 2)E(LCA求树上两点最短距离)
LCA求树上两点最短距离,如果a,b之间距离小于等于k并且奇偶性与k相同显然YES:或者可以从a先走到x再走到y再走到b,并且a,x之间距离加b,y之间距离+1小于等于k并且奇偶性与k相同也输出YES ...
- 模板倍增LCA 求树上两点距离 hdu2586
http://acm.hdu.edu.cn/showproblem.php?pid=2586 课上给的ppt里的模板是错的,wa了一下午orz.最近总是被坑啊... 题解:树上两点距离转化为到根的距离 ...
- HDU 2196 Computer(求树上每一个节点到其他点的最远距离)
解题思路: 求出树的直径的两个端点.则树上每一个节点到其它点的最远距离一定是到这两个端点的距离中最长的那一个. #include <iostream> #include <cstri ...
- HDU 2586 倍增法求lca
How far away ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- POJ 4718 /// 树链剖分+线段树区间合并 求树上两点间的LCIS长度
题目大意: 给定n个点 每个点都有权值 接下来给定树的n条边 第 i 个数 a[i] 表示 i+1到a[i]之间 有一条边 给定q q个询问 每次询问给出 x y 求x到y的最长上升子序列的长度 题解 ...
- POJ-3162 Walking Race (求树上两点之间最大距离)
题目大意:给一棵树,对于所有的点,找出距它最远点的距离,然后将这些距离排成一列,找出最长的一个区间满足:其中的最大值减去最小值不大于m. 题目分析:两次dfs找出距每个节点的最远距离,然后可以通过维护 ...
随机推荐
- ArcMAP中Excel数据转换为shp数据
参考百度知道:http://jingyan.baidu.com/article/f7ff0bfc1cf22c2e26bb138d.html 将数据库中带有X.Y坐标的二维表转换为空间点数据:从数据中将 ...
- Xen的半虚拟化(Paravirtualization)
三个特权级 IA-32体系提供了4个特权级别,正常情况下只用了2个, 操作系统运行在Ring 0,而应用程序运行在Ring 3. Xen让自己运行在Ring 0, 而操作系统运行在Ring 1, 应用 ...
- mysql中explain详解
explain语法 有两种用法: 1.EXPLAIN tbl_name 2.EXPLAIN [EXTENDED] SELECT select_options 为了更好的说明它,我们需要建两张表, ...
- testNG官方文档翻译-1 简介
官方文档链接http://testng.org/doc/documentation-main.html 简介 TestNG是一个被设计用来简化广泛的测试需求的测试框架,它既可应用于单元测试(测试一个独 ...
- Java中的注解是如何工作的?
自Java5.0版本引入注解之后,它就成为了Java平台中非常重要的一部分.开发过程中,我们也时常在应用代码中会看到诸如@Override,@Deprecated这样的注解.这篇文章中,我将向大家讲述 ...
- docker container 的操作
删除所有退出的容器 docker container rm $(docker ps -aq)
- 整合phoenix4.6.0-HBase-1.0到cdh5..4.7 编译phoenix4.6源码 RegionServer 宕机
Phoenix 集成HBase Phoenix 版本:phoenix-4.6.0-HBase-1.0 源码下载地址: http://apache.cs.uu.nl/phoenix/phoenix-4. ...
- Java架构师必看的10本书
1.大型网站系统与JAVA中间件实践 本书围绕大型网站和支撑大型网站架构的Java中间件的实践展开介绍. 从分布式系统的知识切入,让读者对分布式系统有基本的了解:然后介绍大型网站随着数据量.访问量增长 ...
- Linux 档案目录的结构及功能(鸟哥私房菜)
- RedHat版本Linux安装chrome-stable配合chromeDriver进行自动化测试环境准备
一.Linux机器安装google-chrome-stable 1.设置google-chrome软件源 sudo vim /etc/yum.repos.d/google-chrome.repo [g ...