[模板]洛谷T3379 最近公共祖先(LCA) 倍增+邻接表
一年前听说的这东西。。。现在终于会了。。。
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<cmath> 5 #include<ctime> 6 #include<cstdlib> 7 8 #include<string> 9 #include<stack> 10 #include<queue> 11 #include<vector> 12 #include<algorithm> 13 #include<map> 14 #include<set> 15 16 #define M 500005 17 18 using namespace std; 19 20 inline void read(int &x){ 21 x=0; 22 char t=getchar(); 23 bool f=0; 24 25 while(t<'0' || t>'9'){ 26 if(t=='-')f=1; 27 t=getchar(); 28 } 29 30 while(t>='0' && t<='9'){ 31 x=(x<<3)+(x<<1)+t-'0'; 32 t=getchar(); 33 } 34 35 if(f)x=-x; 36 } 37 38 void dfs(int,int); 39 inline int LCA(int,int); 40 41 int u[1000010]; 42 int v[1000010]; 43 int first[500010]; 44 int next[1000010]; 45 46 bool used[500010]; 47 int high[500010]; 48 int fa[500010][20]; 49 50 int n,m,root; 51 int i,j; 52 int x,y; 53 54 int main(){ 55 memset(first,0,sizeof(first)); 56 memset(next,0,sizeof(next)); 57 58 memset(used,0,sizeof(used)); 59 60 read(n);read(m);read(root); 61 62 for(i=1;i<n;i++){ 63 read(x);read(y); 64 65 u[i]=x; 66 v[i]=y; 67 next[i]=first[u[i]]; 68 first[u[i]]=i; 69 70 u[i+M]=y; 71 v[i+M]=x; 72 next[i+M]=first[u[i+M]]; 73 first[u[i+M]]=i+M; 74 } 75 76 dfs(root,1); 77 78 for(i=1;i<=m;i++){ 79 read(x);read(y); 80 81 if(high[x]>high[y])swap(x,y); 82 83 printf("%d\n",LCA(x,y)); 84 } 85 86 return 0; 87 } 88 89 void dfs(int s,int h){ 90 int i,t; 91 92 high[s]=h; 93 used[s]=1; 94 95 for(i=1;(1<<i)<h;i++) 96 fa[s][i]=fa[fa[s][i-1]][i-1]; 97 98 t=first[s]; 99 100 while(t!=0){ 101 if(!used[v[t]]){ 102 fa[v[t]][0]=s; 103 dfs(v[t],h+1); 104 } 105 106 t=next[t]; 107 } 108 } 109 110 inline int LCA(int a,int b){ 111 int dt=high[b]-high[a]; 112 113 for(register int i=0;(1<<i)<=dt;i++) 114 if((1<<i)&dt)b=fa[b][i]; 115 116 if(a==b)return a; 117 else{ 118 for(register int i=19;i>=0;i--) 119 if(fa[a][i]!=fa[b][i]){ 120 a=fa[a][i]; 121 b=fa[b][i]; 122 } 123 124 return fa[a][0]; 125 } 126 }
转载于:https://www.cnblogs.com/running-coder-wfh/p/7570905.html
[模板]洛谷T3379 最近公共祖先(LCA) 倍增+邻接表相关推荐
- 最近公共祖先 (LCA倍增)
题目描述: 题目 解题思路: 首先思考暴力算法,我们先将待处理的 u,vu,vu,v 两点移动到相同深度的地方,然后两个一起向个自的父节点往上跳,直到跳到第一次父节点相同的时候这个相同的父节点即为它们 ...
- 最近公共祖先(LCA)/倍增LCA
目录 题目描述: 分析: 链式前向星: 预处理lg数组: DFS求解深度depth和fa数组: LCA: 完整代码: 样例: 题目描述: 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. ...
- POJ 1330 Nearest Common Ancestors / UVALive 2525 Nearest Common Ancestors (最近公共祖先LCA)...
POJ 1330 Nearest Common Ancestors / UVALive 2525 Nearest Common Ancestors (最近公共祖先LCA) Description A ...
- 【C++】最近公共祖先 LCA
最近公共祖先 百科名片 简单引入 LCA的算法 暴力枚举法 Tarjan离线算法 倍增算法 例题: 题目描述 输入描述 输出描述 样例输入 样例输出 代码 百科名片 最近公共祖先 Lowest Com ...
- 最近公共祖先 (LCA) [No. 21]
问题: 给定一个二叉树,找到两个节点NA, NB的最近公共祖先(LCA). 比如对于下图,4 和 7 的 LCA 是6, 1和13的LCA 是 8. 我们这里先考虑一般的二叉树(BT),然后再考虑这个 ...
- 树上倍增法求最近公共祖先LCA
LCA,最近公共祖先,这个东西有很多作用,因此,如何高效求出LCA就成了一个热点的讨论话题. 下面所有的讨论都以图中这棵树为例子. 先来了解下什么是倍增吧,倍增其实就是二分的逆向,二分是逐渐缩小范围, ...
- 图论--最近公共祖先LCA
最近公共祖先LCA LCA(Least Common Ancestors),即最近公共祖先,是指这样一个问题:在有根树中,找出某两个结点u和v最近的公共祖先(另一种说法,离树根最远的公共祖先) 最近公 ...
- 洛谷P1156 垃圾陷阱 题解浅谈刷表法与填表法
洛谷P1156 垃圾陷阱 题解&浅谈刷表法与填表法 填表法 :就是一般的动态规划,当前点的状态,可以直接用状态方程,根据之前点的状态推导出来. 刷表法:由当前点的状态,更新其他点的状态.需要注 ...
- 最近公共祖先LCA 【专题@AbandonZHANG】
参考: <算法艺术与信息学竞赛> --- 刘汝佳 博客:http://blog.163.com/kevinlee_2010/blog/static/16982082020120794613 ...
最新文章
- 顺序队列相关操作(C语言实现)
- 命令行编译_新鲜货:C++ Build Insights告诉你为啥你的代码编译这么慢
- CSS和JS样式属性对照表
- 修改表主键字段数据类型(V2.0)
- JS 之 数据类型转换
- 【网址收藏】dubbo特新概念及特性、环境搭建、dubbo-monitor安装、rpc原理以及dubbo原理:框架设计、启动解析加载配置信息、服务暴露、服务引用及调用
- python按条件拆分列表元素_如何通过在python中拆分列表元素来创建列表?
- 算法训练 最小乘积(基本型) (蓝桥杯水题)
- 银行委托第三方催收信用卡欠款,是合法吗?
- java excel导出下载_Java导出excel并下载功能
- sublime php测试,sublime phpcs代码检查配置
- 小米首页html代码,小米首页小功能案例.html
- 2017年2月14日实习日记 RHEL下dracut制作initramfs
- (转帖)ConcurrentHashMap实现原理(3)
- 在桌面计算机找不到驱动,电脑杀毒后桌面不见了的原因是什么_怎么解决 - 驱动管家...
- Java并发指南12:深度解读 java 线程池设计思想及源码实现
- python 去掉空格_怎样去掉 sentence 前面的空格 python
- 服务器信号有杂音怎么回事,麦克风有杂音或电流声等的解决方法
- IDEA设置护眼背景及字体大小
- Django REST 框架的 FBV 与 CBV 选择
热门文章
- Oracle订单号就是授权号码,oracle多单号的说明
- spark应用程序转换_Spark—RDD编程常用转换算子代码实例
- mysql连接池_数据库技术:数据库连接池,Commons DbUtils,批处理,元数据
- JavaScript高级之继承
- LeetCode 68. 文本左右对齐(字符串逻辑题)
- LeetCode 198. 打家劫舍(DP)
- LeetCode 841. 钥匙和房间(DFS/BFS)
- python--从入门到实践--chapter 11 代码测试unittest
- java sftp mget_总结三种Shell脚本编程中避免SFTP输入密码的方法
- Python中对象名称前单下划线和双下划线有啥区别