题目链接:http://codevs.cn/problem/2370/

这题我还是做了比较久了,因为有人告诉我这是用tarjan离线做

好吧算我是蒟蒻,真心不懂tarjan怎么做,最后还是用倍增做的

所以我也就借着这题复习了一下RMQ了。。

思想就是定义两个数组f[i][j],dis[i][j]分别表示从i上升2^j层到达的节点和需要的价值

然后就是让两个询问节点先在统一深度需要的价值加上到达同一节点需要的价值,没啥难度,看看难度就懂了

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<queue>
#define maxn 50005
using namespace std;
//倍增
int n,m,dis[maxn][],f[maxn][],dep[maxn],head[maxn];
struct edge{
int u,v,w,nxt;
}e[maxn*]; int tot;
void adde(int u,int v,int w){
e[++tot].u=u;
e[tot].v=v;
e[tot].w=w;
e[tot].nxt=head[u];
head[u]=tot;
} void build(int u)
{
for(int i=head[u];i!=-;i=e[i].nxt){
int v=e[i].v,w=e[i].w;
if(f[v][]==){
f[v][]=u;
dep[v]=dep[u]+;
dis[v][]=w;
build(v);
}
}
} void first(){
for(int j=;j<=;j++){
for(int i=;i<=n;i++){
f[i][j]=f[f[i][j-]][j-];
dis[i][j]=dis[i][j-]+dis[f[i][j-]][j-];
}
}
} int sum=;
int lca(int a,int b){
if(dep[a]<dep[b])swap(a,b);//保证a的深度要深一些
if(dep[a]!=dep[b]){//让不同深度到相同深度
int d=dep[a]-dep[b];
for(int i=;d;i++){
if(d&){
sum+=dis[a][i];
a=f[a][i];
}
d=d>>;//这里是经典的类似二进制的方法分解成2^i1+2^i2+……
}
}
if(a==b)return sum;
for(int i=;i>=;i--){
if(f[a][i]!=f[b][i]){//两个人刚刚好达不到根节点
//这样的意义就是不断的缩小向上扩展的深度,可以到达终点
//因为是不等于才执行,所以循环完了肯定还是到不了
sum+=dis[a][i]+dis[b][i];
a=f[a][i];b=f[b][i];
}
}
sum+=dis[a][]+dis[b][];//2^i=2^i-1+2^i-2+2^1+2^0+2^0
return sum; } int main(){
memset(head,-,sizeof(head));
scanf("%d",&n);
for(int i=;i<n;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
adde(u+,v+,w);adde(v+,u+,w);
}
f[][]=;//倍增过界了就默认为到了根节点
build();
first();
scanf("%d",&m);
for(int i=;i<=m;i++)
{
int a,b;sum=;
scanf("%d%d",&a,&b);
int ans=lca(a+,b+);
printf("%d\n",ans);
}
}

[codevs2370]小机房的树<LCA>的更多相关文章

  1. codevs2370 小机房的树 x

    2370 小机房的树  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond   题目描述 Description 小机房有棵焕狗种的树,树上有N个节点,节点标号 ...

  2. [CodeVS2370] 小机房的树 (LCA, 树链剖分, LCT)

    Description 小机房有棵焕狗种的树,树上有N个节点,节点标号为0到N-1,有两只虫子名叫飘狗和大吉狗,分居在两个不同的节点上.有一天,他们想爬到一个节点上去搞基,但是作为两只虫子,他们不想花 ...

  3. codevs2370 小机房的树

    题目描述 Description 小机房有棵焕狗种的树,树上有N个节点,节点标号为0到N-1,有两只虫子名叫飘狗和大吉狗,分居在两个不同的节点上.有一天,他们想爬到一个节点上去搞基,但是作为两只虫子, ...

  4. 【codevs2370】小机房的树 LCA 倍增

    2370 小机房的树  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题目描述 Description 小机房有棵焕狗种的树,树上有N个节点,节点标号为0 ...

  5. 小机房的树 codevs 2370

    2370 小机房的树  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 小机房有棵焕狗种的树 ...

  6. Codevs 2370 小机房的树

    2370 小机房的树 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description 小机房有棵焕狗种的树,树上有N个节点,节点标号为 ...

  7. CodeVs.2370 小机房的树 ( LCA 倍增 最近公共祖先)

    CodeVs.2370 小机房的树 ( LCA 倍增 最近公共祖先) 题意分析 小机房有棵焕狗种的树,树上有N个节点,节点标号为0到N-1,有两只虫子名叫飘狗和大吉狗,分居在两个不同的节点上.有一天, ...

  8. LCA(倍增在线算法) codevs 2370 小机房的树

    codevs 2370 小机房的树 时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题目描述 Description 小机房有棵焕狗种的树,树上有N个节点, ...

  9. codevs——2370 小机房的树

    2370 小机房的树  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 小机房有棵焕狗种的树,树上有N个 ...

随机推荐

  1. Android模拟器不能上网的解决方法

    我原来一直不用Android的模拟器,因为这东西的多年前的印象真的是很糟糕——启动半个小时,不支持OpenGL.即使后来有了x86镜像,在HAXM的支持下快的飞起,也不想用,因为NDK还要编译x86的 ...

  2. 安装docker,docker-compose,Harbor

    一.docker安装 1.删除旧版本和相关依赖 yum remove docker \ docker-client \ docker-client-latest \ docker-common \ d ...

  3. Feign 在 SpringCloud 中的使用 四

    此处就单纯写一个消费者服务,通过Feign来调用生产者中的接口,生产者中的接口可以自己随便定义一个,前面博客中也有代码 1.导入springcloud Feign的jar包 <parent> ...

  4. vue项目用sha256、md5、base64加密密码

    无论你开发什么样的项目,你可能都会要开发登录.注册.修改密码.忘记密码这些功能,少数项目除外!!要实现这些功能,对于保护用户或者管理员账号密码,这是我们程序员肯定要做的事情.要是用户密码不加密,用明文 ...

  5. vue中犯下的小错误(一)

    在开发采筑平台SRM的移动项目中:一个页面,感觉没啥错误,但是页面报错如下: 页面中的data或者mothods都没有任何问题,但是这个报错很是让人纠结,后来发现,在使用子组件时候: 此tabShow ...

  6. 使用python3编写程序,生成10个随机数,每个元素的值介于1到100之间,并计算所有元素的和、平均值。

    代码如下: import random n = 0 sum = 0 while n < 10: num = random.randint(1, 100) sum = sum + num n += ...

  7. 什么是RPM

    RPM是RedHat Package Manager(RedHat软件包管理工具)的缩写,这一文件格式名称虽然打上了RedHat的标志,但是其原始设计理念是开放式的,现在包括OpenLinux.S.u ...

  8. selenium中js定位

    学习selenium的时候经常用扫的定位方式WebDriver定位方式,但是一些Windows的窗口就无力了,这时候可以用js定位 使用js定位的时候是用DOM树定位方式 eg: document.g ...

  9. kubeasz部署高可用kubernetes1.17.2 并实现traefik2.1.2部署

    模板机操作 # cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) # uname -a //内核升级到4.4.X以后, 关于如何 ...

  10. turtle学习笔记

    1.turtle的绘图窗体 turtle.setup(width, height, startx,starty) - setup()设置窗体大小及位置- 4个参数中后两个可选(后两个省略时默认窗口在屏 ...