题目链接:https://www.luogu.org/problemnew/show/P3379

题意:LCA模板题。

思路:今天开始学树剖,先拿lca练练。树剖解lca,两次dfs复杂度均为O(n),每次查询为logn,因此总复杂度为:O(2*n+m*logn)。

代码:

#include<cstdio>
#include<cstring>
using namespace std;const int maxn=500005;struct node{int v,next;
}edge[2*maxn];int n,m,s,cnt,size[maxn],head[maxn],depth[maxn],son[maxn],fa[maxn],top[maxn];void add(int u,int v){edge[++cnt].v=v;edge[cnt].next=head[u];head[u]=cnt;
}void dfs1(int x){size[x]=1;depth[x]=depth[fa[x]]+1;for(int i=head[x];i;i=edge[i].next){int v=edge[i].v;if(v==fa[x]) continue;fa[v]=x;dfs1(v);size[x]+=size[v];if(!son[x]||size[son[x]]<size[v])son[x]=v;}
}void dfs2(int x,int f){top[x]=f;if(son[x]) dfs2(son[x],f);for(int i=head[x];i;i=edge[i].next){int v=edge[i].v;if(v==fa[x]||v==son[x]) continue;dfs2(v,v);}
}void lca(){for(int i=0;i<m;++i){int x,y;scanf("%d%d",&x,&y);while(top[x]!=top[y]){if(depth[top[x]]>depth[top[y]]) x=fa[top[x]];else y=fa[top[y]];}printf("%d\n",depth[x]<depth[y]?x:y);}
}int main(){scanf("%d%d%d",&n,&m,&s);for(int i=1;i<n;++i){int u,v;scanf("%d%d",&u,&v);add(u,v);add(v,u);}dfs1(s);dfs2(s,s);lca();return 0;
}

转载于:https://www.cnblogs.com/FrankChen831X/p/11167037.html

LCA模板(数剖实现)相关推荐

  1. HDU - 4547 CD操作(LCA模板)

    题目链接:点击查看 题目大意:给出一个层层嵌套的树状结构,可以从某一点通过一个操作直接到达任意一个子节点的位置,但如果要从某个节点到达其祖先节点需要一层一层往上爬,问若要从节点A到达节点B,需要多少步 ...

  2. 51nod 2621 树上距离 (倍增+ LCA 模板)

    51nod 2621 树上距离 (倍增+ LCA 模板) 有一棵n个节点的无向树,每条边有一个边权,现在有q次询问,每次询问给出两个点,求这两个点之间的简单路径上的边权和是多少. 输入格式 第1行:两 ...

  3. Duan2baka的各种LCA模板!

    (这篇文章是模板向-了解具体思想还是看网上其他详细讲解吧QAQ) LCA,即最近公共祖先,是在有根树中两个点最近的公共祖先,在树上问题中非常有用QAQ 常用LCA求法: 一.树链剖分LCA 树链剖分L ...

  4. [蓝桥杯][2018年第九届真题]版本分支(离线LCA模板)

    题目描述 小明负责维护公司一个奇怪的项目.这个项目的代码一直在不断分支(branch)但是从未发生过合并(merge). 现在这个项目的代码一共有N个版本,编号1~N,其中1号版本是最初的版本. 除了 ...

  5. hdu 2586 How far away? (LCA模板)

    题意: N个点,形成一棵树,边有长度. M个询问,每个询问(a,b),询问a和b的距离 思路: 模板题,看代码.DFS预处理算出每个结点离根结点的距离. 注意: qhead[maxn],而不是qhea ...

  6. P3398 仓鼠找sugar(LCA,树剖)

    题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室(c) ...

  7. HDU2586——How far away ?(LCA模板)

    How far away ? 题意:给出一棵树,问两个节点x,y之间的最短距离是多少(边权值). 思路:用根节点到x的距离+根节点到y的距离−多走的距离根节点到x的距离+根节点到y的距离-多走的距离根 ...

  8. (转)LCA模板(倍增法)

    插眼:点击查看 用法:求树上两个节点的公共祖先 代码: const int N=1e5+100;int n;//节点个数int k=log2(n)+1;int dp[N][20];//倍增法int d ...

  9. tarjan求LCA模板

    废话不多说,模板拿来. 1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # ...

最新文章

  1. 引号快捷键_高效率的Excel-Ctrl类快捷键二
  2. 2020-09-27 What is Sector-Bounded Nonlinearities?
  3. 【Linux】一步一步学Linux——write命令(236)
  4. 改进的简单Tooltips显示
  5. 过滤请求绝技 — 布隆过滤器与布谷鸟过滤器
  6. cdh用户权限_cdh设置hdfs权限
  7. Linux中xml导入数据库,XML数据库 BaseX
  8. Linux或者Mac解压乱码问题
  9. 奇妙的安全旅行之加密算法(完整版)
  10. 国家自然科学基金2020年预算减少22亿元
  11. Cloud Container Service experimentation
  12. Git-第五篇廖雪峰Git教程学习笔记(4)分支
  13. 利用Python批量修改多个ass字幕文件
  14. 用计算机在作文格中打单字字,二年级信息技术第3—12课教案
  15. TensorFlow中图(graphs)概念
  16. 最短路——大胖子走迷宫
  17. python Gstreamer 播放不同编码格式的视频文件
  18. 钾肥认沽权证谢幕:揭密2007年股市第一奇案
  19. 华为虚拟机服务器怎么使用教程,虚拟机装服务器教程
  20. 初学orCAD原理图

热门文章

  1. java学习(4):第一个java程序
  2. Linux open函数使用方法记录
  3. 主类网络号怎么算_一文了解网络文化经营许可证的审批范围
  4. java注解 interface_java @FunctionalInterface注解详解
  5. 深入理解Flask中的上下文
  6. ROS与Arduino学习(六)Logging日志
  7. 转:在csv中维护变量参数
  8. python爬虫:两种方法模拟登录博客园
  9. [转]cubemap soft shadow
  10. 微软游戏开发工具XNA 2.0[转自驱动之家]