GeneralLiu

    橙边为轻边

  红边为重边

  绿数为每个点的 top

  橙数为每个点的编号

步骤

1  先预处理 每个点的 deep深度  size子树大小  dad父节点  

2  再预处理 每个点的 top重链顶点

3  就是跳了

应用

洛谷 P2912 [USACO08OCT] 牧场散步

效率蛮高的

此题中用 len[i] 表示 i 到根距离

询问 x 和 y 的距离

答案可用 len[x] + len[y] - 2*len[ lca(x,y) ]表示

而 lca 可以用树剖求出

len[] 在树剖求lca 的预处理中 可以顺带求出来

树剖求 lca 虽然不常用

但它确实很吊

嘻嘻 我的 树剖代码 目前是本题 的 rank1

时间短 空间小

#include<bits/stdc++.h>
#define N 1003
using namespace std;
int cnt,head[N],to[N<<],dis[N<<],next[N<<],len[N],size[N],deep[N],dad[N],n,m,top[N];
int read(){//读入优化
char ch=getchar();
int ans=;
while(!isdigit(ch))ch=getchar();
while(isdigit(ch)){
ans=ans*+ch-'';
ch=getchar();
}
return ans;
}
int lca(int x,int y){//树剖求lca
for(;top[x]!=top[y];){
if(deep[top[x]]<deep[top[y]])x^=y^=x^=y;//利用二进制的 swap()
x=dad[top[x]];
}
if(deep[x]>deep[y])x^=y^=x^=y;
return x;
}
void dfs(int k){//步骤1
int v;
size[k]=,deep[k]=deep[dad[k]]+;
for(int i=head[k];i;i=next[i]){
v=to[i];
if(v!=dad[k])//各种预处理,包括针对本题的 len[]数组
len[v]=dis[i]+len[k],dad[v]=k,dfs(v),size[k]+=size[v];
}
} void dfs1(int k){//步骤2
int t=,v;
if(!top[k])top[k]=k;
for(int i=head[k];i;i=next[i]){
v=to[i];
if(v!=dad[k]&&size[t]<size[v])
t=v;
}
if(t)top[t]=top[k],dfs1(t);
for(int i=head[k];i;i=next[i]){
v=to[i];
if(v!=dad[k]&&v!=t)
dfs1(v);
}
}
int main(){
n=read(),m=read();
int x,y,z;
while(--n){
x=read(),y=read(),z=read();
next[++cnt]=head[x];
to[cnt]=y;
head[x]=cnt;
dis[cnt]=z;
next[++cnt]=head[y];
to[cnt]=x;
head[y]=cnt;
dis[cnt]=z;
}
dfs();
dfs1();
while(m--){
x=read(),y=read();
printf("%d\n",len[x]+len[y]-(len[lca(x,y)]<<));
}
return ;
}

最新文章

  1. MFC Socket
  2. OCR文字设别软件没有权限管理服务器上的许可证怎么办
  3. 怎样在java代码中调用执行shell脚本
  4. 数学概念——G 最大公约数
  5. 【Django】Django与jinja的不同
  6. Java使用PipedStream管道流通信
  7. centos7下root密码丢失解决方案
  8. 吐血Eclipse Maven Selenium TestNG的各种坑
  9. 了不起的WebRTC:生态日趋完善,或将实时音视频技术白菜化
  10. CF528D Fuzzy Search
  11. 2017-2018-1 20155326信息安全系统设计基础》嵌入式C语言课上考试补交
  12. httpclient请求服务的各种方法实例
  13. MySQL的SQL语句
  14. 方法 - ShellCode测试
  15. 实用JS代码
  16. SQL与NOSQL
  17. Vue 实现loading进度条
  18. 未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序
  19. UVa 1616 Caravan Robbers (二分+贪心)
  20. Hunger Snake 2

热门文章

  1. B - Archer
  2. Android偏好设置(7)自定义Preference,和PreferenceDialog
  3. for循环的阶乘
  4. Spring中bean的五个作用域简介(转载)
  5. windowsEvents
  6. hadoop-0.20.2完全分布式集群
  7. 开源一个Mac漂亮的小工具 PPRows for Mac, 在Mac上优雅的计算你写了多少行代码
  8. Farseer.net轻量级ORM开源框架 V1.x 教程目录
  9. leetcode_998. Maximum Binary Tree II
  10. java图片放大或缩小