洛谷 3379 最近公共祖先(LCA 倍增)

题意分析

裸的板子题,但是注意这题n上限50w,我用的边表,所以要开到100w才能过,一开始re了两发,发现这个问题了。

代码总览

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <cmath>
  5. #define nmax 1000100
  6. #define demen 21
  7. using namespace std;
  8. int fa[nmax][demen],dis[nmax],head[nmax],dep[nmax];
  9. int n,m,tot = 0;
  10. struct node{
  11. int to;
  12. int next;
  13. int w;
  14. }edge[nmax];
  15. void add(int u, int v){
  16. edge[tot].to = v;
  17. edge[tot].next = head[u];
  18. head[u] = tot++;
  19. }
  20. void dfs(int rt,int f){
  21. fa[rt][0] = f;
  22. for(int i = 1;i<=20;++i){
  23. fa[rt][i] = fa[fa[rt][i-1]][i-1];
  24. }
  25. for(int i = head[rt];i!=-1;i = edge[i].next){
  26. int nxt = edge[i].to;
  27. if(nxt != f){
  28. dep[nxt] = dep[rt] + 1;
  29. dfs(nxt,rt);
  30. }
  31. }
  32. }
  33. int lca(int x, int y){
  34. int X = x,Y=y;
  35. if(dep[x] < dep[y]) swap(x,y);
  36. int dre = dep[x] - dep[y];
  37. for(int i = 20;i>=0;--i){
  38. if((1<<i) & dre)
  39. x = fa[x][i];
  40. }
  41. if(x == y) return(x);
  42. for(int i = 20;i>=0;--i){
  43. if(fa[x][i] != fa[y][i]){
  44. x = fa[x][i],y = fa[y][i];
  45. }
  46. }
  47. return(fa[x][0]);
  48. }
  49. void init(){
  50. memset(fa,0,sizeof fa);
  51. memset(head,-1,sizeof head);
  52. memset(dep,0,sizeof dep);
  53. tot = 0;
  54. }
  55. int main()
  56. {
  57. init();
  58. int n,m,k,u,v,w,root = 0;
  59. scanf("%d %d %d",&n,&k,&root);
  60. for(int i = 0;i<n-1;++i){
  61. scanf("%d %d",&u,&v);
  62. add(u,v);
  63. add(v,u);
  64. }
  65. dep[root] = 1;
  66. dfs(root,0);
  67. int ans = 0;
  68. for(int i = 0;i<k;++i){
  69. scanf("%d %d",&u,&v);
  70. printf("%d\n",lca(u,v));
  71. }
  72. return 0;
  73. }

洛谷 3379 最近公共祖先(LCA 倍增)的更多相关文章

  1. 【lhyaaa】最近公共祖先LCA——倍增!!!

    高级的算法——倍增!!! 根据LCA的定义,我们可以知道假如有两个节点x和y,则LCA(x,y)是 x 到根的路 径与 y 到根的路径的交汇点,同时也是 x 和 y 之间所有路径中深度最小的节 点,所 ...

  2. 最近公共祖先 LCA 倍增算法

          树上倍增求LCA LCA指的是最近公共祖先(Least Common Ancestors),如下图所示: 4和5的LCA就是2 那怎么求呢?最粗暴的方法就是先dfs一次,处理出每个点的深度 ...

  3. luogu3379 【模板】最近公共祖先(LCA) 倍增法

    题目大意:给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 整体步骤:1.使两个点深度相同:2.使两个点相同. 这两个步骤都可用倍增法进行优化.定义每个节点的Elder[i]为该节点的2^k( ...

  4. 最近公共祖先 LCA 倍增法

    [简介] 解决LCA问题的倍增法是一种基于倍增思想的在线算法. [原理] 原理和同样是使用倍增思想的RMQ-ST 算法类似,比较简单,想清楚后很容易实现. 对于每个节点u , ancestors[u] ...

  5. Luogu 2245 星际导航(最小生成树,最近公共祖先LCA,并查集)

    Luogu 2245 星际导航(最小生成树,最近公共祖先LCA,并查集) Description sideman做好了回到Gliese 星球的硬件准备,但是sideman的导航系统还没有完全设计好.为 ...

  6. POJ 1470 Closest Common Ancestors(最近公共祖先 LCA)

    POJ 1470 Closest Common Ancestors(最近公共祖先 LCA) Description Write a program that takes as input a root ...

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

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

  8. [模板] 最近公共祖先/lca

    简介 最近公共祖先 \(lca(a,b)\) 指的是a到根的路径和b到n的路径的深度最大的公共点. 定理. 以 \(r\) 为根的树上的路径 \((a,b) = (r,a) + (r,b) - 2 * ...

  9. LCA算法倍增算法(洛谷3379模板题)

    倍增(爬树)算法,刚刚学习的算法.对每一个点的父节点,就记录他的2k的父亲. 题目为http://www.luogu.org/problem/show?pid=3379 第一步先记录每一个节点的深度用 ...

随机推荐

  1. 使用maven&&make-distribution.sh编译打包spark源码

    1>基础环境准备: jdk1.8.0_101 maven 3.3.9scala2.11.8 安装好上述软件,配置好环境变量,并检查是否生效. 2>配置maven:intellij idea ...

  2. 【坚持】Selenium+Python学习之从读懂代码开始 DAY4

    2018/05/21 [生成器详解:廖雪峰的官方网站](https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d ...

  3. dom学习要点

    Dom操作 1.文本内容操作 - innerText:操作文本 - innerHtml:操作全内容 //innerText标签: <div id='i2' ><a>土味程序员& ...

  4. Calico网络方案

    参考文档: Difficulties with traditional overlay networks:https://www.projectcalico.org/learn/ Get Start( ...

  5. 高可用OpenStack(Queen版)集群-14.Openstack集成Ceph准备

    参考文档: Install-guide:https://docs.openstack.org/install-guide/ OpenStack High Availability Guide:http ...

  6. 从Web抓取信息

    来源:python编程快速上手——Al Sweigart webbrowser:是 Python 自带的,打开浏览器获取指定页面. requests:从因特网上下载文件和网页. Beautiful S ...

  7. mail邮件详解

    基础命令学习目录首页 1.配置   vim /etc/mail.rc文件尾增加以下内容 set from=1968089885@qq.com smtp="smtp.qq.com"s ...

  8. Description Resource Path Location Type Cannot change version of project fac

    http://www.cnblogs.com/eaysun/p/5661631.html

  9. 20162314 《Program Design & Data Structures》Learning Summary Of The Second Week

    20162314 2017-2018-1 <Program Design & Data Structures>Learning Summary Of The Second Week ...

  10. A Survey on the Security of Stateful SDN Data Planes

    论文摘要: 本文为读者提供新兴的SDN带状态数据平面,集中关注SDN数据平面编程性带来的隐患. I部分 介绍 A.带状态SDN数据平面的兴起 B.带状态数据平面带来的安全隐患 引出带状态数据平面的安全 ...