LCA模板(数剖实现)
题目链接: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模板(数剖实现)相关推荐
- HDU - 4547 CD操作(LCA模板)
题目链接:点击查看 题目大意:给出一个层层嵌套的树状结构,可以从某一点通过一个操作直接到达任意一个子节点的位置,但如果要从某个节点到达其祖先节点需要一层一层往上爬,问若要从节点A到达节点B,需要多少步 ...
- 51nod 2621 树上距离 (倍增+ LCA 模板)
51nod 2621 树上距离 (倍增+ LCA 模板) 有一棵n个节点的无向树,每条边有一个边权,现在有q次询问,每次询问给出两个点,求这两个点之间的简单路径上的边权和是多少. 输入格式 第1行:两 ...
- Duan2baka的各种LCA模板!
(这篇文章是模板向-了解具体思想还是看网上其他详细讲解吧QAQ) LCA,即最近公共祖先,是在有根树中两个点最近的公共祖先,在树上问题中非常有用QAQ 常用LCA求法: 一.树链剖分LCA 树链剖分L ...
- [蓝桥杯][2018年第九届真题]版本分支(离线LCA模板)
题目描述 小明负责维护公司一个奇怪的项目.这个项目的代码一直在不断分支(branch)但是从未发生过合并(merge). 现在这个项目的代码一共有N个版本,编号1~N,其中1号版本是最初的版本. 除了 ...
- hdu 2586 How far away? (LCA模板)
题意: N个点,形成一棵树,边有长度. M个询问,每个询问(a,b),询问a和b的距离 思路: 模板题,看代码.DFS预处理算出每个结点离根结点的距离. 注意: qhead[maxn],而不是qhea ...
- P3398 仓鼠找sugar(LCA,树剖)
题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室(c) ...
- HDU2586——How far away ?(LCA模板)
How far away ? 题意:给出一棵树,问两个节点x,y之间的最短距离是多少(边权值). 思路:用根节点到x的距离+根节点到y的距离−多走的距离根节点到x的距离+根节点到y的距离-多走的距离根 ...
- (转)LCA模板(倍增法)
插眼:点击查看 用法:求树上两个节点的公共祖先 代码: const int N=1e5+100;int n;//节点个数int k=log2(n)+1;int dp[N][20];//倍增法int d ...
- tarjan求LCA模板
废话不多说,模板拿来. 1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # ...
最新文章
- 引号快捷键_高效率的Excel-Ctrl类快捷键二
- 2020-09-27 What is Sector-Bounded Nonlinearities?
- 【Linux】一步一步学Linux——write命令(236)
- 改进的简单Tooltips显示
- 过滤请求绝技 — 布隆过滤器与布谷鸟过滤器
- cdh用户权限_cdh设置hdfs权限
- Linux中xml导入数据库,XML数据库 BaseX
- Linux或者Mac解压乱码问题
- 奇妙的安全旅行之加密算法(完整版)
- 国家自然科学基金2020年预算减少22亿元
- Cloud Container Service experimentation
- Git-第五篇廖雪峰Git教程学习笔记(4)分支
- 利用Python批量修改多个ass字幕文件
- 用计算机在作文格中打单字字,二年级信息技术第3—12课教案
- TensorFlow中图(graphs)概念
- 最短路——大胖子走迷宫
- python Gstreamer 播放不同编码格式的视频文件
- 钾肥认沽权证谢幕:揭密2007年股市第一奇案
- 华为虚拟机服务器怎么使用教程,虚拟机装服务器教程
- 初学orCAD原理图