题目大意:

询问一棵树里 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的更多相关文章

  1. HDU 2874 /// tarjan离线求森林里两点的距离

    题目大意: 在一个森林里 询问 u v 两点 若不能到达输出 "Not connected" 否则输出两点距离 https://blog.csdn.net/keyboarderqq ...

  2. 【HDOJ2586】【Tarjan离线求LCA】

    http://acm.hdu.edu.cn/showproblem.php?pid=2586 How far away ? Time Limit: 2000/1000 MS (Java/Others) ...

  3. cogs 2450. 距离 树链剖分求LCA最近公共祖先 快速求树上两点距离 详细讲解 带注释!

    2450. 距离 ★★   输入文件:distance.in   输出文件:distance.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 在一个村子里有N个房子,一 ...

  4. 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 ...

  5. 模板倍增LCA 求树上两点距离 hdu2586

    http://acm.hdu.edu.cn/showproblem.php?pid=2586 课上给的ppt里的模板是错的,wa了一下午orz.最近总是被坑啊... 题解:树上两点距离转化为到根的距离 ...

  6. HDU 2196 Computer(求树上每一个节点到其他点的最远距离)

    解题思路: 求出树的直径的两个端点.则树上每一个节点到其它点的最远距离一定是到这两个端点的距离中最长的那一个. #include <iostream> #include <cstri ...

  7. HDU 2586 倍增法求lca

    How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  8. POJ 4718 /// 树链剖分+线段树区间合并 求树上两点间的LCIS长度

    题目大意: 给定n个点 每个点都有权值 接下来给定树的n条边 第 i 个数 a[i] 表示 i+1到a[i]之间 有一条边 给定q q个询问 每次询问给出 x y 求x到y的最长上升子序列的长度 题解 ...

  9. POJ-3162 Walking Race (求树上两点之间最大距离)

    题目大意:给一棵树,对于所有的点,找出距它最远点的距离,然后将这些距离排成一列,找出最长的一个区间满足:其中的最大值减去最小值不大于m. 题目分析:两次dfs找出距每个节点的最远距离,然后可以通过维护 ...

随机推荐

  1. R语言中样本平衡的几种方法

    R语言中样本平衡的几种方法 在对不平衡的分类数据集进行建模时,机器学习算法可能并不稳定,其预测结果甚至可能是有偏的,而预测精度此时也变得带有误导性.在不平衡的数据中,任一算法都没法从样本量少的类中获取 ...

  2. Mentor_丝印检查——手工绘制丝印线条(标注)到丝印位号距离的检查

    http://www.eda365.com/thread-193942-1-1.html 在此之前丝印的检查基本是停留在丝印与阻焊的距离检查,而器件丝印框和手工绘制的线条与器件位号的检查都不到位,据我 ...

  3. Linux关闭端口

    1.  查看哪些端口被占用 $ netstat -anp | grep 2042 tcp 0 0 192.168.56.1:2042 0.0.0.0:* LISTEN 8974/python 2. 删 ...

  4. HVM(Hardware-Assisted Virtualization)

    A set of extra instructions is added that can be used by a process in VMX rootmode. These instructio ...

  5. python中正则匹配之re模块

    Python中正则表达式 re:re是提供正则表达式匹配操作的模块 一.什么是正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某个模式匹配,Python 自1.5版本起 ...

  6. Ubuntu18.04 一键升级Python所有第三方包

    一.pip是什么 pip 是 Python 包管理工具,该工具提供了对Python 包的查找.下载.安装.卸载的功能. 二.升级pip版本 1.默认Ubuntu自带的pip (pip 9.0.1)是基 ...

  7. Codeforces Round #536 E. Lunar New Year and Red Envelopes /// 贪心 记忆化搜索 multiset取最大项

    题目大意: 给定n m k:(1≤n≤1e5, 0≤m≤200, 1≤k≤1e5) 表示n个时间长度内 最多被打扰m次 k个红包 接下来k行描述红包 s t d w:(1≤s≤t≤d≤n , 1≤w≤ ...

  8. jetson更换源

    参考链接:https://blog.csdn.net/qq_36396941/article/details/88903094 Nano的镜像默认是国外的源,速度很慢,国内的源有的上不去,有的包无法安 ...

  9. CR0 - CR4 ,5个寄存器,留念,每次都要翻手册,太费事了

  10. Java 整型数组只有一个整数是只出现一次的,其余都出现两次

    package writtenExamination; /** * @author lindaZ * @date 2015年10月22日 * @todo 找出数组中仅出现一次的数,其余数字出现两次 * ...