#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
#include<cmath>
#include<map>
using namespace std; const int mx=4e4+;
struct N
{
int v,d;
N(int x,int y)
{
v=x;
d=y;
}
};
vector<N>g[mx],q[mx];
int father[mx];
int dis[mx];
bool vs[mx];
int ans[mx]; void Init(int n)
{
for (int i=;i<=n;i++)
{
father[i]=i;
dis[i]=;
vs[i]=false;
g[i].clear();
q[i].clear();
}
} int Find(int x)
{
int w=x;
while (w!=father[w]) w=father[w];
while (x!=father[x])
{
int fa=father[x];
father[x]=w;
x=fa;
}
return w;
} void un(int x,int y)
{
int rx=Find(x);
int ry=Find(y);
father[y]=x;
} void dfs(int u,int fa,int d)
{
dis[u]=d;
vs[u]=true;
for (int i=;i<g[u].size();i++)
{
N k=g[u][i];
if (vs[k.v]) continue;
dfs(k.v,u,d+k.d);
}
for (int i=;i<q[u].size();i++)
{
N k=q[u][i];
if (!vs[k.v]) continue;
ans[k.d]=dis[u]+dis[k.v]-*dis[Find(k.v)];
}
un(fa,u);
} int main()
{
int n,m;
int t;
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&n,&m);
Init(n);
for (int i=;i<n;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
g[u].push_back(N(v,w));
g[v].push_back(N(u,w));
}
for (int i=;i<=m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
q[u].push_back(N(v,i));
q[v].push_back(N(u,i));
}
dfs(,,);
for (int i=;i<=m;i++) printf("%d\n",ans[i]);
}
}

hdu 2586 How far away ?(离线求最近公共祖先)的更多相关文章

  1. 【LCA求最近公共祖先+vector构图】Distance Queries

    Distance Queries 时间限制: 1 Sec  内存限制: 128 MB 题目描述 约翰的奶牛们拒绝跑他的马拉松,因为她们悠闲的生活不能承受他选择的长长的赛道.因此他决心找一条更合理的赛道 ...

  2. POJ 1986 Distance Queries (Tarjan算法求最近公共祖先)

    题目链接 Description Farmer John's cows refused to run in his marathon since he chose a path much too lo ...

  3. 求最近公共祖先(LCA)的各种算法

    水一发题解. 我只是想存一下树剖LCA的代码...... 以洛谷上的这个模板为例:P3379 [模板]最近公共祖先(LCA) 1.朴素LCA 就像做模拟题一样,先dfs找到基本信息:每个节点的父亲.深 ...

  4. tarjan算法求最近公共祖先

    tarjian算法 LCA: LCA(Least Common Ancestor),顾名思义,是指在一棵树中,距离两个点最近的两者的公共节点.也就是说,在两个点通往根的道路上,肯定会有公共的节点,我们 ...

  5. 用“倍增法”求最近公共祖先(LCA)

    1.最近公共祖先:对于有根树T的两个结点u.v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u.的祖先且x的深度尽可能大. 2.朴素算法:记录下每个节点的父亲,使节点u,v一步一步地向上找 ...

  6. LCA 在线倍增法 求最近公共祖先

    第一步:建树  这个就不说了 第二部:分为两步  分别是深度预处理和祖先DP预处理 DP预处理: int i,j; ;(<<j)<n;j++) ;i<n;++i) ) fa[i ...

  7. hdu 2586 欧拉序+rmq 求lca

    题意:求树上任意两点的距离 先说下欧拉序 对这颗树来说 欧拉序为 ABDBEGBACFHFCA 那欧拉序有啥用 这里先说第一个作用 求lca 对于一个欧拉序列,我们要求的两个点在欧拉序中的第一个位置之 ...

  8. hdu 2586 How far away ? ( 离线 LCA , tarjan )

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

  9. LCA 最近公共祖先 Tarjan(离线)算法的基本思路及其算法实现

    首先是最近公共祖先的概念(什么是最近公共祖先?): 在一棵没有环的树上,每个节点肯定有其父亲节点和祖先节点,而最近公共祖先,就是两个节点在这棵树上深度最大的公共的祖先节点. 换句话说,就是两个点在这棵 ...

随机推荐

  1. AX7: CREATE AN AUTOMATED TEST PACKAGE\MODEL

    AX7: CREATE AN AUTOMATED TEST PACKAGE\MODEL It’s really important for a stable solution the use of a ...

  2. MySQL 基础语句

    MySQL 基础语句 多个知识点 ----------------------------------------------------------------------------------- ...

  3. [python学习] 介绍python的property,以及为什么要用setter,一个小栗子

    python中的property是比较好用的. 先来一段代码 #-*- coding:utf-8 -*- class C(object): status_dict = { 1: 'accept', 2 ...

  4. go语言环境搭建+sublime text3(windows环境下)

    感觉有点坑,整了一下午~搞定 go语言环境搭建+sublime text3(windows环境下) 1.安装sublime text3 2.安装go语言程序包 3.测试go语言是否安装成功     键 ...

  5. java学习第15天(Linklist Vector)

    根据集合的分类(上一天有说),首先接触的是ArrayList但是和Collection一样,他没有什么特殊的功能,直接跳过,然后是Vector. 一   Vector A:有特有功能 a:添加 pub ...

  6. 比较常用的几个maven第三方镜像

    OSC的:<mirror>    <id>CN</id>    <name>OSChina Central</name>           ...

  7. CentOS7中升级Docker版本

    参考:http://blog.csdn.net/liumiaocn/article/details/52130852

  8. Objective - C 值对象 NSNumber和NSValue

    在进行数据处理的时候,因为对象类型的不同, 并不能进行相应的数据处理,所以必须要进行数据类型的转换,这也就是NSNumber,NSValue这两类值对象出现的原因. 简而言之,NSNumber就是实现 ...

  9. Linux内核分析 第二周

    Linux内核分析——完成一个简单的时间片轮转多道程序内核代码 张潇月+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-100 ...

  10. VAssistX使用小窍门

    日常使用中的一些VAssistX使用小窍门,简单总结下 一,修改VAssistX默认缓存文件路径,防止默认C盘被占用空间过大 1.  打开注册表HKCU\Software\Whole Tomato,新 ...