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( ...
随机推荐
- python学习笔记:目录结构
"项目目录结构"其实也是属于"可读性和可维护性"的范畴. 目录组织方式 关于如何组织一个较好的Python工程目录结构,已经有一些得到了共识的目录结构.在Sta ...
- VC2008中如何为MFC应用程序添加和删除消息响应函数
最近重温<MFC Windows应用程序设计>第二版这本书,里面的代码全部是使用VC6.0写的,我Win7下安装的是VS2008开发环境. VC2008下添加和删除常见的消息响应函数有两种 ...
- 【足迹C++primer】47、Moving Objects(2)
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/cutter_point/article/details/37954805 Moving Object ...
- hive HQL笔记
#建表 create table sign_in (uri string , test string) row format delimited fields terminated by '|'; # ...
- Centos 文件权限修改
1.查看权限 # ls -l dirPath 2.修改权限,root权限执行(-R 子目录的权限都会改变) # chmod -R dirPath
- FastAdmin 关于列表渲染文字过长导致页面难以管理的问题
先贴一张图片做个例子 看不清图片的朋友可以右键图片,在<新标签页中打开图片>; 可以看到,由于内容过长,导致后面操作的增删改要拉到最后才能操作. 在我们的FastAdmin中,目前我还没找 ...
- MNIST多图显示--Python练习
在学习TensorFlow框架时,提到用MNIST手写数字数据库进行练习,为了更直观看下里面的数据到底长啥样,用OpenCV(cv2)中的imshow函数来进行显示. 默认已经安装: numpy.te ...
- ios打包,通过Xcode生成ipa文件
ios打包,通过Xcode生成ipa文件 干货文章 ·2018-03-21 19:03:47 打开ios项目目录,配置证书 将运行设备选择,如下图 选择:Product -> Scheme -& ...
- 添加ali yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo #yum clean a ...
- 一些笔记jexcel
根据坐标或者指定列标题 jexcel.getColumnNameFromId([ x, y ]);