一年前听说的这东西。。。现在终于会了。。。

  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) 倍增+邻接表相关推荐

  1. 最近公共祖先 (LCA倍增)

    题目描述: 题目 解题思路: 首先思考暴力算法,我们先将待处理的 u,vu,vu,v 两点移动到相同深度的地方,然后两个一起向个自的父节点往上跳,直到跳到第一次父节点相同的时候这个相同的父节点即为它们 ...

  2. 最近公共祖先(LCA)/倍增LCA

    目录 题目描述: 分析: 链式前向星: 预处理lg数组: DFS求解深度depth和fa数组: LCA: 完整代码: 样例: 题目描述: 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. ...

  3. POJ 1330 Nearest Common Ancestors / UVALive 2525 Nearest Common Ancestors (最近公共祖先LCA)...

    POJ 1330 Nearest Common Ancestors / UVALive 2525 Nearest Common Ancestors (最近公共祖先LCA) Description A ...

  4. 【C++】最近公共祖先 LCA

    最近公共祖先 百科名片 简单引入 LCA的算法 暴力枚举法 Tarjan离线算法 倍增算法 例题: 题目描述 输入描述 输出描述 样例输入 样例输出 代码 百科名片 最近公共祖先 Lowest Com ...

  5. 最近公共祖先 (LCA) [No. 21]

    问题: 给定一个二叉树,找到两个节点NA, NB的最近公共祖先(LCA). 比如对于下图,4 和 7 的 LCA 是6, 1和13的LCA 是 8. 我们这里先考虑一般的二叉树(BT),然后再考虑这个 ...

  6. 树上倍增法求最近公共祖先LCA

    LCA,最近公共祖先,这个东西有很多作用,因此,如何高效求出LCA就成了一个热点的讨论话题. 下面所有的讨论都以图中这棵树为例子. 先来了解下什么是倍增吧,倍增其实就是二分的逆向,二分是逐渐缩小范围, ...

  7. 图论--最近公共祖先LCA

    最近公共祖先LCA LCA(Least Common Ancestors),即最近公共祖先,是指这样一个问题:在有根树中,找出某两个结点u和v最近的公共祖先(另一种说法,离树根最远的公共祖先) 最近公 ...

  8. 洛谷P1156 垃圾陷阱 题解浅谈刷表法与填表法

    洛谷P1156 垃圾陷阱 题解&浅谈刷表法与填表法 填表法 :就是一般的动态规划,当前点的状态,可以直接用状态方程,根据之前点的状态推导出来. 刷表法:由当前点的状态,更新其他点的状态.需要注 ...

  9. 最近公共祖先LCA 【专题@AbandonZHANG】

    参考: <算法艺术与信息学竞赛> --- 刘汝佳 博客:http://blog.163.com/kevinlee_2010/blog/static/16982082020120794613 ...

最新文章

  1. 顺序队列相关操作(C语言实现)
  2. 命令行编译_新鲜货:C++ Build Insights告诉你为啥你的代码编译这么慢
  3. CSS和JS样式属性对照表
  4. 修改表主键字段数据类型(V2.0)
  5. JS 之 数据类型转换
  6. 【网址收藏】dubbo特新概念及特性、环境搭建、dubbo-monitor安装、rpc原理以及dubbo原理:框架设计、启动解析加载配置信息、服务暴露、服务引用及调用
  7. python按条件拆分列表元素_如何通过在python中拆分列表元素来创建列表?
  8. 算法训练 最小乘积(基本型) (蓝桥杯水题)
  9. 银行委托第三方催收信用卡欠款,是合法吗?
  10. java excel导出下载_Java导出excel并下载功能
  11. sublime php测试,sublime phpcs代码检查配置
  12. 小米首页html代码,小米首页小功能案例.html
  13. 2017年2月14日实习日记 RHEL下dracut制作initramfs
  14. (转帖)ConcurrentHashMap实现原理(3)
  15. 在桌面计算机找不到驱动,电脑杀毒后桌面不见了的原因是什么_怎么解决 - 驱动管家...
  16. Java并发指南12:深度解读 java 线程池设计思想及源码实现
  17. python 去掉空格_怎样去掉 sentence 前面的空格 python
  18. 服务器信号有杂音怎么回事,麦克风有杂音或电流声等的解决方法
  19. IDEA设置护眼背景及字体大小
  20. Django REST 框架的 FBV 与 CBV 选择

热门文章

  1. Oracle订单号就是授权号码,oracle多单号的说明
  2. spark应用程序转换_Spark—RDD编程常用转换算子代码实例
  3. mysql连接池_数据库技术:数据库连接池,Commons DbUtils,批处理,元数据
  4. JavaScript高级之继承
  5. LeetCode 68. 文本左右对齐(字符串逻辑题)
  6. LeetCode 198. 打家劫舍(DP)
  7. LeetCode 841. 钥匙和房间(DFS/BFS)
  8. python--从入门到实践--chapter 11 代码测试unittest
  9. java sftp mget_总结三种Shell脚本编程中避免SFTP输入密码的方法
  10. Python中对象名称前单下划线和双下划线有啥区别