参考博客

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

那这样就可以变成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. python学习笔记:网络请求——requests模块

    上面讲过的urllib模块太麻烦了,还有一个比较方便的模块,就是requests模块,好用到你怀疑人生·^_^,一定要会哦 需要安装,pip install requests即可,下面是request ...

  2. 使用jmeter做接口测试----柠檬不萌!

    一.乱码解决方案 1.jmeter查看结果树乱码 (1)在jmeter的bin目录下找到jmeter.properties这个文件,添加上 sampleresult.default.encoding= ...

  3. JWT工具类

    package com.ynhrm.common.utils; import io.jsonwebtoken.Claims;import io.jsonwebtoken.JwtBuilder;impo ...

  4. 18-python基础-字符串(1)

    1.字符串的定义 字符串就是一串字符,是编程语言中表示文本的数据类型. 在python中可以使用一对双引号“”或者一对单引号‘’定义一个字符串. 可以使用索引获取一个字符串中指定位置的字符,索引计数从 ...

  5. 使用apache搭建tomcat集群

    1.安装apache 1.1 下载ApacheX64.rar,并解压 1.2 修改Apache24\conf\httpd.conf文件 配置根目录: 配置ip和端口 1.2 安装apache服务器 以 ...

  6. a number of 和the number of用法

    a number of 和the number of用法 1.   A number of + 複數名詞 + 複數動詞           =some/或a lot of + 複數名詞 + 複數動詞 ...

  7. Mint安装配置Sublime Text3

    1.注册码: Sublime Text 3 3126 注册码 2.安装Package Control组件: 按Ctrl+`调出console(注:安装有QQ输入法的这个快捷键会有冲突的,输入法属性设置 ...

  8. 用dialog包制作窗口

    #!/bin/bash temp=$(mktemp -t test.XXXXXX) temp2=$(mktemp -t test.XXXXXX) function diskspace { df -k ...

  9. io.lettuce.core.RedisCommandExecutionException: ERR unknown command 'GEOADD'

    io.lettuce.core.RedisCommandExecutionException: ERR unknown command 'GEOADD' at io.lettuce.core.Exce ...

  10. javafx将数据库内容输出到tableview表格

    一 .创建Fxml文件,用Javafx Scene Builder 编辑页面,创建tableview(表格)和tablecolum(表格中的列),并为其设置fxid: 二.生成fxml文件的控制类: ...