LCA 算法(一)ST表
介绍一种解决最近公共祖先的在线算法,st表,它是建立在线性中的rmq问题之上。
代码:
1 //LCA: DFS+ST(RMQ) 2 3 #include<cstdio> 4 #include<cctype> 5 #include<iostream> 6 using namespace std; 7 8 const int size=500010; 9 int n,m,s,tot; 10 int first[size],log[size<<1],f[size<<1][60],head[size<<1],p[size<<1][60]; 11 bool vis[size]; 12 struct node1 13 { 14 int path,depth; 15 }a[size*2]; 16 struct node2 17 { 18 int next,to; 19 }e[size*2]; 20 21 inline int read() 22 { 23 int x=0,f=1; 24 char c=getchar(); 25 while (!isdigit(c)) 26 f=c=='-'?-1:1,c=getchar(); 27 while (isdigit(c)) 28 x=(x<<1)+(x<<3)+(c^48),c=getchar(); 29 return x*f; 30 } 31 32 inline int write(int x) 33 { 34 if (x<0) 35 x=-x; 36 if (x>9) 37 write(x/10); 38 putchar(x%10+48); 39 } 40 41 inline void add(int from,int to) 42 { 43 ++tot; 44 e[tot].to=to; 45 e[tot].next=head[from]; 46 head[from]=tot; 47 } 48 49 inline void logn() 50 { 51 int i; 52 log[0]=-1; 53 for (i=1;i<=n*2+1;i++) 54 log[i]=log[(i>>1)]+1; 55 } 56 57 inline void DFS(int x,int dep) 58 { 59 a[++tot].path=x; 60 a[tot].depth=dep; 61 first[x]=tot; 62 vis[x]=true; 63 for (int i=head[x];i;i=e[i].next) 64 if (!vis[e[i].to]) 65 { 66 DFS(e[i].to,dep+1); 67 a[++tot].path=x; 68 a[tot].depth=dep; 69 } 70 } 71 72 inline void ST() 73 { 74 int i,j; 75 for (i=1;i<=tot;i++) 76 f[i][0]=i; 77 for (j=1;j<=log[tot];j++) 78 for (i=1;i+(1<<j)<=tot;i++) 79 { 80 if (a[f[i][j-1]].depth<a[f[i+(1<<j-1)][j-1]].depth) 81 f[i][j]=f[i][j-1]; 82 else 83 f[i][j]=f[i+(1<<j-1)][j-1]; 84 } 85 } 86 87 inline int RMQ(int l,int r) 88 { 89 int w=log[r-l+1]; 90 return a[f[l][w]].depth<a[f[r-(1<<w)+1][w]].depth?f[l][w]:f[r-(1<<w)+1][w]; 91 } 92 93 inline int LCA(int u,int v) 94 { 95 int x=first[u],y=first[v]; 96 if (x>y) 97 swap(x,y); 98 return a[RMQ(x,y)].path; 99 } 100 101 int main() 102 { 103 int i,j,x,y; 104 n=read(); 105 m=read(); 106 s=read(); 107 logn(); 108 for (i=1;i<n;i++) 109 { 110 x=read(); 111 y=read(); 112 add(x,y); 113 add(y,x); 114 } 115 tot=0; 116 DFS(s,1); 117 ST(); 118 while (m--) 119 { 120 x=read(); 121 y=read(); 122 write(LCA(x,y)); 123 putchar(10); 124 } 125 return 0; 126 }
转载于:https://www.cnblogs.com/Ronald-MOK1426/p/8999211.html
LCA 算法(一)ST表相关推荐
- 【JZOJ5064】【GDOI2017第二轮模拟day2】友好城市 Kosarajo算法+bitset+ST表+分块
题面 在Byteland 一共有n 座城市,编号依次为1 到n,这些城市之间通过m 条单向公路连接. 对于两座不同的城市a 和b,如果a 能通过这些单向道路直接或间接到达b,且b 也能如此到达a,那么 ...
- 倍增算法入门 超详细解答+LCA+RMQ(ST表)+例题剖析
目录 一.倍增算法 二.倍增算法的应用:求LCA(最近公共祖先)附模板题 三.倍增算法的应用:RMQ 问题(ST表)附模板题 一.倍增算法 要了解倍增之前,强烈建议大家先看一下这位大佬对倍增的解释:[ ...
- 倍增算法入门 超详细解答+LCA+RMQ(ST表)+例题剖析
目录 一.倍增算法 二.倍增算法的应用:求LCA(最近公共祖先)附模板题 三.倍增算法的应用:RMQ 问题(ST表)附模板题 一.倍增算法 要了解倍增之前,强烈建议大家先看一下这位大佬对倍增的解释:[ ...
- szu 寒训 day#3 ST表 和 LCA问题 附例题 菜鸡解法
昨天我们讲述了树状数组今天我们来讲ST表(解决静态RMQ (Rang Minmum/Maximum Query)问题的数据结构) 假如说我们暴力去查询区间的最值得话每次操作都是O(n) 如果询问次数跟 ...
- LCA RMQ+ST表学习笔记
RMQ RMQ问题:在给定的一个长度位N的区间中,有M个询问,每次询问给出区间[L,R],求出区间段元素的 最大值/最小值.对于RMQ问题很容易想到遍历的做法,将区间[L,R]中的元素遍历一遍,即可寻 ...
- [51nod] 1766树上的最远点对 树的直径 树剖LCA+ST表静态查询
题意: 给你一棵带权树,q次查询,每次给出两个区间,[l1,r1][l2,r2][l_1,r_1] [l_2,r_2][l1,r1][l2,r2]从这两个区间中分别选择两个数字,使得这两个点的 ...
- 【BZOJ2588】Count on a tree,主席树维护链+ST表求LCA
传送门 写在前面:一天下来就写了两道主席树的题--(codevs上的一道智障天梯不算) 思路: 才知道原来主席树不仅可以通过dfs序维护子树区间,还可以直接维护一条到根的链-- 我们建好主席树后,每次 ...
- [Bzoj4540][Hnoi2016] 序列(莫队 + ST表 + 单调队列)
4540: [Hnoi2016]序列 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 1567 Solved: 718 [Submit][Statu ...
- poj3264(ST表模版)
ST 表算法用于查询区间最值,为静态算法,查询区间最值时不能更新信息,预处理复杂度为 O(nlongn),查询为 O(1).适用于不更新信息且查询很多的问题. 题意:求解范围内最高的奶牛和最短的奶牛之 ...
最新文章
- 第十五周程序阅读-范型程序设计(2)
- Mac上运行第一个Hadoop实例
- C#并行编程中的Parallel.Invoke
- 工厂三兄弟之工厂方法模式
- php ajax实现分页效果
- 什么是CDN ,CDN的作用
- Apache OpenJPA 2.1.0 发布
- linux错误自动报告工具,linux – 关闭abrt的电子邮件通知(自动错误报告工具)
- 金融情报挖掘:面向公开文本的期货事件聚合与传导因素分析
- linux 修改php配置,PHP部署时的几个配置修改说明
- 游戏筑基开发之测试篇2(C语言)
- 【板绘必读】完全0基础如何学板绘?
- 接待员如何向客人upsell_酒店前厅部概述-.ppt
- 线段树+平衡树(STL) 勤快的love 枫
- 如何搭建DHCP服务器及自动获取IP地址及相关操作
- 历年奥斯卡获奖影片(1927—2014)
- 服务器修改bios中uefi,服务器bios uefi设置
- 『自己的工作4』TensorFlow2.0自动微分和手工求导的结果对比!
- 安卓版的PanDownload 下载网盘资源
- Auto.js学习笔记1:开发需要准备什么工具和编程语言知识?
热门文章
- 蓝桥杯BASIC-28 基础练习 Huffuman树
- request.getInputStream中文乱码解决方案
- ArcGIS9.3 SDE安装
- 解决beego中同时开启http和https时,https端口占用问题
- 系统集成管理师2011下半年软考透解 四
- 虚拟化--vsphere排错组件归纳
- Java 利用SWFUpload多文件上传 session 为空失效,不能验证的问题
- iOS(iPhone/iPad)开发新手必读
- Evernote 全球开发者大赛最终入围作品介绍
- ConnectionRead (WrapperRead())Timeout expired