LCA的RMQ求法
仔细想一想:最近的公共祖先,其实,搜索时回朔,连通这两点,那深度最低肯定是最近的公共祖先啊。
那这样就可以变成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求法的更多相关文章
- LCA和RMQ
下面写提供几个学习LCA和RMQ的博客,都很通熟易懂 http://dongxicheng.org/structure/lca-rmq/ 这个应该是讲得最好的,且博主还有很多其他文章,可以读读,感觉认 ...
- ZOJ 3195 Design the city LCA转RMQ
题意:给定n个点,下面n-1行 u , v ,dis 表示一条无向边和边权值,这里给了一颗无向树 下面m表示m个询问,问 u v n 三点最短距离 典型的LCA转RMQ #include<std ...
- [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 ...
- lca转RMQ
这个博客写得好 #include <stdio.h> #include <vector> #include <string.h> using namespace s ...
- 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) ...
- [模板]LCA的倍增求法解析
题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...
- 【51NOD1766】树上的最远点对(线段树,LCA,RMQ)
题意:n个点被n-1条边连接成了一颗树,给出a~b和c~d两个区间, 表示点的标号请你求出两个区间内各选一点之间的最大距离,即你需要求出max{dis(i,j) |a<=i<=b,c< ...
- LCA与RMQ
一.什么是LCA? LCA:Least Common Ancestors(最近公共祖先),对于一棵有根树T的任意两个节点u,v,求出LCA(T, u, v),即离跟最远的节点x,使得x同时是u和v的祖 ...
- POJ 1986(LCA and RMQ)
题意:给定一棵树,求任意两点之间的距离. 思路:由于树的特殊性,所以任意两点之间的路径是唯一的.u到v的距离等于dis(u) + dis(v) - 2 * dis(lca(u, v)); 其中dis( ...
随机推荐
- 10.Jmeter 快速入门教程 -- 用Jmeter测试你的EJB
有时候,需要对EJB进行性能基准测试,这对开发非常有帮助. 有很多种方法可以这么做, 当然我们这里介绍Apache's Jmeter 来进行实验测试. 非常不幸的是, Jmeter没有提供一个现成的测 ...
- C# 网络编程 TcpListener
1.服务断代码 public partial class Server : Form { private bool lk = true; public Server() { InitializeCom ...
- Python可以用于客户端Web开发吗?
N00b在Python,但我有大量的PHP经验,并希望扩展我的技能. 我知道Python在服务器端执行方面很出色,只是想知道客户端. 解决方案 你看过skulpt吗? http://www.skulp ...
- zabbix--External checks 外部命令检测
概述zabbix server 运行脚本或者二进制文件来执行外部检测,外部检测不需要在被监控端运行任何 agentditem key 语法如下: 参数 定义 script shell 脚本或者二进制文 ...
- kali linux 2019.4 最新版设置中文 - 开启win10风格界面
最新版 kali linux 2019.4 默认是不带中文字体的,执行以下命令,便可以显示: kali源:vi /etc/apt/source.list #中科大 deb http://mirrors ...
- 不用 PS 和 AI,5个网站能做出更好看的设计
要完成漂亮的设计,一定要掌握 PS.AI.Sketch 等专业的做图工具才可以.其实,现在有很多网站可以帮助不会专业设计工具的我们,做出很多很漂亮的设计,完成自己的设计需求.今天,我们就来介绍一下这些 ...
- Android开发:Handler的简单使用(一)
1.Handler是什么? 原文: A Handler allows you to send and process Message and Runnable objects associated w ...
- Docker部署web环境之Lanmt
2. 案例二 整套项目多容器分离通过docker-compose部署lanmt环境 详细的安装准备环境,省略,配置以及部署参考案例一即可 即可实现批量创建web,也可以实现多web共用一个php或my ...
- BZOJ 1576: [Usaco2009 Jan]安全路经Travel
日常自闭半小时后看题解,太弱了qwq. 感觉这道题还是比较难的,解法十分巧妙,不容易想到. 首先题目说了起点到每个点的最短路都是唯一的,那么对这个图求最短路图必定是一棵树,而且这棵树是唯一的. 那么我 ...
- Dubbox服务的消费方配置
在src/main/resources下创建applicationContext-web.xml <?xml version="1.0" encoding="UTF ...