#include <iostream>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <cstdio>
#include <algorithm>
#include <map>
#define LL long long using namespace std;
const int N = 5e4; int head[N],tot;
int sum,dir[N],ver[N*],R[N*],first[N],visit[N];
int dp[*N][];
struct nodes
{
int to,next,w;
}Edge[N]; void E_init()
{
tot = ;
memset(head,-,sizeof(head));
} void add(int u,int v,int w)
{
Edge[tot].to = v;
Edge[tot].w = w;
Edge[tot].next = head[u];
head[u] = tot++;
} void dfs(int u,int dep)
{
visit[u] = ;
ver[++sum] = u;
first[u] = sum;
R[sum] = dep;
for(int i = head[u]; i != -; i = Edge[i].next)
{
if(!visit[Edge[i].to])
{
dir[Edge[i].to] = dir[u]+Edge[i].w;
dfs(Edge[i].to,dep+);
ver[++sum] = u;
R[sum] = dep;
}
}
} void ST(int n)
{
for(int i = ; i <= n; i++)
dp[i][] = i;
for(int j = ; (<<j)<=n; j++)
{
for(int i = ;i+(<<j)-<=n; i++)
{
int l,r;
l = dp[i][j-];
r = dp[i+ (<<(j-))][j-];
dp[i][j] = R[l]<R[r]?l:r;
}
}
} int RMQ(int l,int r)
{
//int k = log(r-l+1)/log(2);
int k = ;
while( (<<(k+)) <= r - l + ) k++;
int ll = dp[l][k], rr = dp[r-(<<k)+][k];
return R[ll]<R[rr]?ll:rr;
} int LCA(int u,int v)
{
int x = first[u],y = first[v];
if(x > y) swap(x,y);
return ver[RMQ(x,y)];
} void solve()
{
int n,q;
scanf("%d %d",&n,&q);
E_init();
for(int i = ; i < n-; i++)
{
int u,v,w;
scanf("%d %d %d",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
memset(visit,,sizeof(visit));
sum = ;
dir[] = ; dfs(,);
ST(n*-); while(q--)
{
int a,b,c;
scanf("%d %d",&a,&b);
c = LCA(a,b);
printf("%d\n",dir[a]+dir[b]-*dir[c]);
} } int main(void)
{
int t;
scanf("%d",&t);
while(t--)
{
solve();
}
return ;
}

hdu 2586 (lca-RMQ)的更多相关文章

  1. HDU 2586 (LCA模板题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2586 题目大意:在一个无向树上,求一条链权和. 解题思路: 0 | 1 /   \ 2      3 ...

  2. [hdu 2586]lca模板题(在线+离线两种版本)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 在线版本: 在线方法的思路很简单,就是倍增.一遍dfs得到每个节点的父亲,以及每个点的深度.然后 ...

  3. HDU 2586 ( LCA/tarjan算法模板)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 题意:n个村庄构成一棵无根树,q次询问,求任意两个村庄之间的最短距离 思路:求出两个村庄的LCA,d ...

  4. hdu 2586(LCA在线ST)

    How far away ? Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): A ...

  5. HDU 2586 LCA

    题目大意: 多点形成一棵树,树上边有权值,给出一堆询问,求出每个询问中两个点的距离 这里求两个点的距离可以直接理解为求出两个点到根节点的权值之和,再减去2倍的最近公共祖先到根节点的距离 这是自己第一道 ...

  6. hdu - 2586 (LCA板子题)

    传送门 (这次的英文题面要比上一个容易看多了) (英语蒟蒻的卑微) 又是一个很裸的LCA题 (显然,这次不太容易打暴力咧) (但听说还是有大佬用dfs直接a掉了) 正好 趁这个机会复习一下LCA 这里 ...

  7. hdu 2586 lca在线算法(朴素算法)

    #include<stdio.h> #include<string.h>//用c/c++会爆栈,用g++ac #define inf 0x3fffffff #define N ...

  8. HDU 2586 How far away ? (LCA)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 LCA模版题. RMQ+LCA: #include <iostream> #incl ...

  9. HDU - 2586 How far away ?(LCA模板题)

    HDU - 2586 How far away ? Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & ...

  10. hdu 2586 How far away ?倍增LCA

    hdu 2586 How far away ?倍增LCA 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2586 思路: 针对询问次数多的时候,采取倍增 ...

随机推荐

  1. No packages marked for update

    问题:用yum安装docker,更新yum存储时,报以下错误,导致yum坏了 [root@localhost yum.repos.d]# vi docker.repo [root@localhost ...

  2. LoadRunner如何调用外部函数

    LoadRunner如何调用外部函数 使用 VuGen 时,可以调用在外部 DLL 中定义的函数.通过从脚本调用外部函数,可以降低脚本的内存使用量以及总体运行时间.要调用外部函数,需要加载定义了该函数 ...

  3. 实现Linux下不间断聊天和退出处理

    实现Linux下不间断聊天和退出处理

  4. 数论整除——cf1059D

    用map是卡着过去的..题解用vector+离散化后常数小了十倍.. 总之就是把所有模数给保存下来然后离散化,再去匹配一下即可,最后有个细节 自己的 #include<bits/stdc++.h ...

  5. 12DUILib经典教程(实例)

    Duilib经典实例教程:1基本框架:一个简单的Duilib程序一般是下面这个样子的:://Duilib使用设置部分:#pragmaonce:#defineWIN32_LEAN_AND_ME:#def ...

  6. python 继承中的__init__

    如果子类不重写__init__, 实例化子类时,会自动调用父类定义的__init__ 如果子类要重写__init__,实例化子类,就不会调用父类已经定义的__init__ 所以如果想要扩充父类,需要显 ...

  7. java使用stream流批量读取并合并文件,避免File相关类导致单文件过大造成的内存溢出。

    import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.F ...

  8. Linux的基本原则

    Linux的基本原则:1.由目的单一的小程序组成,一个程序只做一件事,且做好: 2.’组合小程序完成复杂任务: 3.一切皆文件: 4.尽量避免捕获用户接口: 5.配置文件保存为纯文本格式: 6.提供机 ...

  9. OSG实现利用菲波那契网格(Fibonacci lattice 或 Fibonacci grid)均分球面

    #include<Windows.h> #include<osg/Node> #include<osg/Geode> #include<osg/Group&g ...

  10. 搭建一个Semantic-ui项目

    一.进入到项目目录 npm init 二.安装semantic-ui npm install semantic-ui --save 三.编译输出semantic-ui cd  ./semantic g ...