参考博客

仔细想一想:最近的公共祖先,其实,搜索时回朔,连通这两点,那深度最低肯定是最近的公共祖先啊。

那这样就可以变成RMQ问题了。

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
const int max_=;
int ip,tot;
struct Tree{//树
int to;
int next;
int v;
};
struct Tree a[max_*];
int first[max_];//第一次出现的位置
int edge[max_];//边记录next
int de[max_*];//深度
int id[max_*];//遍历编号(包含回朔)
int dis[max_];//到根的距离。
int dp[max_*][];//st表,记录的是下标
bool vis[max_];//标记数组
void add_edge(int x,int y,int v)//建树
{
a[++ip].to=y;
a[ip].v=v;
a[ip].next=edge[x];
edge[x]=ip;
}
void dfs(int x,int deep)//dfs遍历
{
if(vis[x]==)
{
first[x]=tot;//记录第一次
vis[x]=;
}
de[tot]=deep,id[tot++]=x;
for(int i=edge[x];i;i=a[i].next)
{
int go_to=a[i].to;
if(vis[go_to])
continue;
int go_v=a[i].v;
dis[go_to]=dis[x]+go_v;//跟新距离
dfs(go_to,deep+);
id[tot]=x,de[tot++]=deep;
}
}
int Min(int x,int y)//寻找最小深度
{
if(de[x]>de[y])
return y;
else
return x;
}
void RMQ_ST(int len)
{
for(int i=;i<len;i++)//初始化
dp[i][]=i;
for(int j=;(<<j)<=len;j++)
for(int i=;i+(<<j)-<len;i++)
{
dp[i][j]=Min(dp[i][j-],dp[i+(<<(j-))][j-]);
}
}
int RMQ_question(int l,int r)
{
int k=;
while((<<(k+))<=r-l+)k++;
return Min(dp[l][k],dp[r-(<<k)+][k]);
}
void itin()
{
memset(vis,,sizeof(vis));
memset(dis,,sizeof(dis));
memset(edge,,sizeof(edge));
tot=;
ip=;
}
int main()
{
int T;
cin>>T;
while(T--)
{
itin();
int n,m;
cin>>n>>m;
for(int i=;i<n-;i++)
{
int x,y,v;
cin>>x>>y>>v;
add_edge(x,y,v);
add_edge(y,x,v);
}
dfs(,);
RMQ_ST(tot);
for(int i=;i<m;i++)
{
int u,v,k;
cin>>u>>v;
if(first[u]>first[v])//先出现的为左
{
k=RMQ_question(first[v],first[u]);
}
else
k=RMQ_question(first[u],first[v]);
int temp=dis[u]+dis[v]-(*dis[id[k]]);
cout<<temp<<endl;
}
}
return ;
}

LCA的RMQ求法的更多相关文章

  1. LCA和RMQ

    下面写提供几个学习LCA和RMQ的博客,都很通熟易懂 http://dongxicheng.org/structure/lca-rmq/ 这个应该是讲得最好的,且博主还有很多其他文章,可以读读,感觉认 ...

  2. ZOJ 3195 Design the city LCA转RMQ

    题意:给定n个点,下面n-1行 u , v ,dis 表示一条无向边和边权值,这里给了一颗无向树 下面m表示m个询问,问 u v n 三点最短距离 典型的LCA转RMQ #include<std ...

  3. [CF 191C]Fools and Roads[LCA Tarjan算法][LCA 与 RMQ问题的转化][LCA ST算法]

    参考: 1. 郭华阳 - 算法合集之<RMQ与LCA问题>. 讲得很清楚! 2. http://www.cnblogs.com/lazycal/archive/2012/08/11/263 ...

  4. lca转RMQ

    这个博客写得好 #include <stdio.h> #include <vector> #include <string.h> using namespace s ...

  5. HDU 3078 LCA转RMQ

    题意: n个点 m个询问 下面n个数字表示点权值 n-1行给定一棵树 m个询问 k u v k为0时把u点权值改为v 或者问 u-v的路径上 第k大的数 思路: LCA转RMQ求出 LCA(u,v) ...

  6. [模板]LCA的倍增求法解析

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

  7. 【51NOD1766】树上的最远点对(线段树,LCA,RMQ)

    题意:n个点被n-1条边连接成了一颗树,给出a~b和c~d两个区间, 表示点的标号请你求出两个区间内各选一点之间的最大距离,即你需要求出max{dis(i,j) |a<=i<=b,c< ...

  8. LCA与RMQ

    一.什么是LCA? LCA:Least Common Ancestors(最近公共祖先),对于一棵有根树T的任意两个节点u,v,求出LCA(T, u, v),即离跟最远的节点x,使得x同时是u和v的祖 ...

  9. POJ 1986(LCA and RMQ)

    题意:给定一棵树,求任意两点之间的距离. 思路:由于树的特殊性,所以任意两点之间的路径是唯一的.u到v的距离等于dis(u) + dis(v) - 2 * dis(lca(u, v)); 其中dis( ...

随机推荐

  1. Oracle执行计划不走索引的原因总结

    在Oracle数据库操作中,为什么有时一个表的某个字段明明有索引,当观察一些语的执行计划确不走索引呢?如何解决呢?本文我们主要就介绍这部分内容,接下来就让我们一起来了解一下. 不走索引大体有以下几个原 ...

  2. python面试题之如何用Python找出你目前在哪个目录?

    >>> import os >>> os.getcwd() 'C:\Users\lifei\AppData\Local\Programs\Python\Python ...

  3. BUUCTF 派大星的烦恼

    这道题做的累死了,题目关键在于思路,这里将做题的完整思路记下来.题目给了一张bmp,用010打开可以看出题目关键就在于这一段D和“,保存出来 "DD"DD""& ...

  4. 在linux上安装jdk

    一.环境 1.  VMware虚拟机 2.  Linux系统(centos7) 安装步骤: 1.  先安装VMtools 2.  查看是否有openjdk,若有先将系统内的openJDK删除(采用 r ...

  5. Codeforces 1156D 带权并查集

    题意:给你一颗树,树边的权值可能是0或1,问先走0边,再走1边,或者只走1边的路径有多少条? 思路:对于一个点,假设通过0边相连的点一共有x个(包括自己),通过1边相连的有y个(包括自己),那么对答案 ...

  6. 笔记60 Spring+Mybatis整合

    整合思路:将SessionFactory交给Spring管理,并且把Mapper和XML结合起来使用. 一.目录结构 二.基本的pojo Category.java package com.pojo; ...

  7. 几种任务调度的 Java 实现方法与比较(定时任务)(转)

    转自:http://blog.csdn.net/javafay/article/details/8031269 综观目前的 Web 应用,多数应用都具备任务调度的功能.本文由浅入深介绍了几种任务调度的 ...

  8. webpack起的项目怎么用手机访问?

    默认情况下 webpack-dev-server只能通过 localhost 访问 如果需要通过 ip 地址访问,修改 npm 配置文件中的 scripts 属性中对应的启动脚本 例如 start 或 ...

  9. CF687D Dividing Kingdom II

    \(\mathtt{CF 687D}\) \(\mathcal{Description}\) 给你一个图有 \(n\) 个点 \((1 \leq n \leq 10^3)\) 和 \(m\) 条边 \ ...

  10. java相差小时数

    public static String getTime(Date date){ StringBuffer time = new StringBuffer(); Date date2 = new Da ...