Code:

#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=40000+3;
typedef long long ll;
ll dis[maxn];
int son[maxn],siz[maxn],rank1[maxn],p[maxn],top[maxn];
struct Edge {
int from, to, dis;
Edge(int from, int to, int dis) :from(from), to(to), dis(dis){}
};
struct LCA{
vector<Edge>edges;
vector<int>G[maxn];
void init(int n){
for(int i=1;i<=n;++i)G[i].clear();
edges.clear();
memset(son,-1,sizeof(son));memset(dis,0,sizeof(dis));
memset(rank1,0,sizeof(rank1));memset(p,0,sizeof(p));
memset(siz,0,sizeof(siz));memset(top,0,sizeof(top));
}
void add_edge(int from,int to,int dis){
edges.push_back(Edge(from,to,dis));
int m=edges.size()-1;
G[from].push_back(m);
}
void dfs1(int u,int fa,int cur,ll dep)
{
siz[u]=1,p[u]=fa,rank1[u]=cur;
dis[u]=dep;
for(int i=0;i<G[u].size();++i)
{
int m=G[u][i];
Edge E=edges[m];
if(E.to!=fa)
{
dfs1(E.to,u,cur+1,dep+E.dis);
siz[u]+=siz[E.to];
if(son[u]==-1||siz[son[u]]<siz[E.to])son[u]=E.to;
}
}
}
void dfs2(int u,int tp){
top[u]=tp;
if(son[u]!=-1)dfs2(son[u],tp);
for(int i=0;i<G[u].size();++i)
{
int m=G[u][i];
Edge E=edges[m];
if(E.to!=p[u]&&E.to!=son[u])dfs2(E.to,E.to);
}
}
int query(int x,int y)
{
while(top[x]!=top[y])
{
if(rank1[top[x]]<=rank1[top[y]])y=p[top[y]];
else x=p[top[x]];
}
if(rank1[x]<=rank1[y])return x;
return y;
}
ll ans(int x,int y)
{
ll m1=dis[x],m2=dis[y];
int lca=query(x,y);
return m1+m2-2*dis[lca];
}
};
int main(){
int T;scanf("%d",&T);
while(T--)
{
int n,m;scanf("%d%d",&n,&m);
LCA _lca;
_lca.init(n);
for(int i=1;i<n;++i)
{
int from,to,dis;
scanf("%d%d%d",&from,&to,&dis);
_lca.add_edge(from,to,dis);
_lca.add_edge(to,from,dis);
}
_lca.dfs1(1,-1,1,0);
_lca.dfs2(1,1);
for(int i=1;i<=m;++i)
{
int a,b;scanf("%d%d",&a,&b);
printf("%lld\n",_lca.ans(a,b));
}
}
return 0;
}

  

Hdu 2586 树链剖分求LCA的更多相关文章

  1. 树链剖分求LCA

    树链剖分中各种数组的作用: siz[]数组,用来保存以x为根的子树节点个数 top[]数组,用来保存当前节点的所在链的顶端节点 son[]数组,用来保存重儿子 dep[]数组,用来保存当前节点的深度 ...

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

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

  3. cogs 2109. [NOIP 2015] 运输计划 提高组Day2T3 树链剖分求LCA 二分答案 差分

    2109. [NOIP 2015] 运输计划 ★★★☆   输入文件:transport.in   输出文件:transport.out   简单对比时间限制:3 s   内存限制:256 MB [题 ...

  4. HDU2586 How far away ? (树链剖分求LCA)

    用树链剖分求LCA的模板: 1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 const ...

  5. 【树链剖分】洛谷P3379 树链剖分求LCA

    题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...

  6. 【POJ1330】Nearest Common Ancestors(树链剖分求LCA)

    Description A rooted tree is a well-known data structure in computer science and engineering. An exa ...

  7. 【模板】树链剖分求LCA

    洛谷3379 #include<cstdio> #include<algorithm> using namespace std; ,inf=1e9; int n,m,x,y,r ...

  8. hdu 5274 树链剖分

    Dylans loves tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

  9. hdu 5893 (树链剖分+合并)

    List wants to travel Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/O ...

随机推荐

  1. 注解实战aftersuite和beforesuite

    package com.course.testng;import org.testng.annotations.*; public class BasicAnnotation { //最基本的注解,用 ...

  2. NOI 2018 你的名字 (后缀自动机+线段树合并)

    题目大意:略 令$ION2017=S,ION2018=T$ 对$S$建$SAM$,每次都把$T$放进去跑,求出结尾是i的前缀串,能匹配上$S$的最长后缀长度为$f_{i}$ 由于$T$必须在$[l,r ...

  3. spring mvc 下载的时候中文文件名不显示

    Headers.add("Content-Disposition", "attachment;filename=" + new String(file.getB ...

  4. xmllint命令

    xmllint是一个很方便的处理及验证xml的工具,linux下只要安装libxml2就可以使用这个命令,下面整理一些常用功能 1. --format 此参数用于格式化xml,使其具有良好的可读性. ...

  5. java ee服务器/应用服务器的理解

    42.由Apache.Sun 和其他一些公司及个人共同开发而成.由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现.43.可以这样认为,当在一台机器上配 ...

  6. HDU 2865

    和上题一样,但K较大,不能直接用矩阵来写.这个矩阵必定是这个形式的. 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 分成对角线上元素B与非对角线上元素A k: 1 2 3 4 ... ...

  7. POJ 1281 MANAGER

    MANAGER Time Limit:1000MS    Memory Limit:10000KB    64bit IO Format:%I64d & %I64u Description O ...

  8. OpenMp之reduction求和

    // OpenMP1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include"omp.h" #include& ...

  9. 从ORA-27300,ORA-27301到ORA-00064

        近期因为session数量添加,须要调整session,也就是要调整process參数. 看是比較简单的一个问题,却遭遇了ORA-27300,ORA-27301.因为这个涉及到了有关内核參数k ...

  10. &quot;singleTask&quot;模式 切换到新的栈中

    本文截取了网络资源的结论部分 对singletask 启动模式做笔记记录. 尽管SubActivity的launchMode被设置为"singleTask"模式,可是它并不像官方文 ...