1. type arr=record v,nt:longint; end;
  2. const maxn=; lx=;
  3. var lt:array[..maxn] of longint;
  4. eg:array[..maxn*] of arr;
  5. d:array[..maxn] of longint;
  6. g:array[..maxn,..lx] of longint;
  7. n,i,x,y,a,b,sum:longint;
  8. procedure swap(var a,b:longint);
  9. var c:longint;
  10. begin
  11. c:=a; a:=b; b:=c;
  12. end;
  13. procedure add(x,y:longint);
  14. begin
  15. inc(sum); eg[sum].nt:=lt[x]; eg[sum].v:=y; lt[x]:=sum;
  16. end;
  17. procedure Tinit(x,fa:longint);
  18. var i:longint;
  19. begin
  20. g[x,]:=fa; d[x]:=d[fa]+;
  21. for i:= to lx do
  22. g[x,i]:=g[g[x,i-],i-];
  23. i:=lt[x];
  24. while i<> do
  25. begin
  26. if eg[i].v<>fa then Tinit(eg[i].v,x);
  27. i:=eg[i].nt;
  28. end;
  29. end;
  30. function Tlca(x,y:longint):longint;
  31. var dep,i:longint;
  32. begin
  33. if d[x]<d[y] then swap(x,y);
  34. dep:=d[x]-d[y];
  35. for i:= to lx- do
  36. if dep and (<<i) > then
  37. x:=g[x,i];
  38. if x=y then exit(x);
  39. for i:=lx- downto do
  40. if g[x,i]<>g[y,i] then
  41. begin
  42. x:=g[x,i];
  43. y:=g[y,i];
  44. end;
  45. exit(g[x][]);
  46. end;
  47. function Tdist(x,y:longint):longint;
  48. begin
  49. exit(d[x]+d[y]-d[Tlca(x,y)]*);
  50. end;
  51. begin
  52. readln(n,a,b);
  53. sum:=;
  54. while not eof do
  55. begin
  56. read(x);
  57. while not eoln do
  58. begin
  59. read(y);
  60. add(x,y);
  61. add(y,x);
  62. end;
  63. readln;
  64. end;
  65. Tinit(,);
  66. writeln(Tlca(a,b));
  67. writeln(Tdist(a,b));
  68. end.

LCA(倍增)的更多相关文章

  1. 【codevs2370】小机房的树 LCA 倍增

    2370 小机房的树  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题目描述 Description 小机房有棵焕狗种的树,树上有N个节点,节点标号为0 ...

  2. LCA倍增算法

    LCA 算法是一个技巧性很强的算法. 十分感谢月老提供的模板. 这里我实现LCA是通过倍增,其实就是二进制优化. 任何一个数都可以有2的阶数实现 例如16可以由1 2 4 8组合得到 5可以由1 2 ...

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

    洛谷 3379 最近公共祖先(LCA 倍增) 题意分析 裸的板子题,但是注意这题n上限50w,我用的边表,所以要开到100w才能过,一开始re了两发,发现这个问题了. 代码总览 #include &l ...

  4. CodeVs.2370 小机房的树 ( LCA 倍增 最近公共祖先)

    CodeVs.2370 小机房的树 ( LCA 倍增 最近公共祖先) 题意分析 小机房有棵焕狗种的树,树上有N个节点,节点标号为0到N-1,有两只虫子名叫飘狗和大吉狗,分居在两个不同的节点上.有一天, ...

  5. POJ.1986 Distance Queries ( LCA 倍增 )

    POJ.1986 Distance Queries ( LCA 倍增 ) 题意分析 给出一个N个点,M条边的信息(u,v,w),表示树上u-v有一条边,边权为w,接下来有k个询问,每个询问为(a,b) ...

  6. POJ.1330 Nearest Common Ancestors (LCA 倍增)

    POJ.1330 Nearest Common Ancestors (LCA 倍增) 题意分析 给出一棵树,树上有n个点(n-1)条边,n-1个父子的边的关系a-b.接下来给出xy,求出xy的lca节 ...

  7. LCA(倍增在线算法) codevs 2370 小机房的树

    codevs 2370 小机房的树 时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题目描述 Description 小机房有棵焕狗种的树,树上有N个节点, ...

  8. LCA(最近公共祖先)——LCA倍增法

    一.前人种树 博客:最近公共祖先 LCA 倍增法 博客:浅谈倍增法求LCA 二.沙场练兵 题目:POJ 1330 Nearest Common Ancestors 代码: const int MAXN ...

  9. POJ - 1330 Nearest Common Ancestors(dfs+ST在线算法|LCA倍增法)

    1.输入树中的节点数N,输入树中的N-1条边.最后输入2个点,输出它们的最近公共祖先. 2.裸的最近公共祖先. 3. dfs+ST在线算法: /* LCA(POJ 1330) 在线算法 DFS+ST ...

  10. 次小生成树(LCA倍增)

    算法: 求出MST之后枚举每条在MST之外的边 连上之后会出现环 找到环中除加上的边之外权值最大的边 删除该边之后得到一颗新树 做法: 利用LCA倍增地维护最小生成树上两点之间的最大边权 每次枚举在M ...

随机推荐

  1. C# 获取当前星期几三种实现方法(转)

    获取当前星期几实现这个功能有多种方法,接下来将列出3种供你参考,感兴趣的你可不要错过了哈,希望本文所提供的知识点对你有所帮助 第一种: string[] Day = new string[] { &q ...

  2. 阮一峰:RSA算法原理(一)

    今天看到一篇好文章,关于加密算法,收藏了觉得不过瘾,还是自己贴一遍,也能加深一下印象. 原文链接:http://www.ruanyifeng.com/blog/2013/06/rsa_algorith ...

  3. mybatis中的mapper.xml

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-/ ...

  4. Adriod—— DVM

    Android 运行环境主要指的虚拟机技术——Dalvik.Android中的所有Java程序都是运行在Dalvik VM上的.Android上的每个程序都有自己的线程,DVM只执行.dex的Dalv ...

  5. NDK JNI 的关键点

    1.System.loadLibrary 的名字是在Android.mk里面设定的   LOCAL_MODULE    := httpdown,MODULE   后面跟的就是了 2.如何正确调用到关键 ...

  6. 二模 (12)day2

    第一题: 题目大意: 有N颗糖,两个人轮流取,每次只能取质数颗,不能取的输.求先取者若必胜,最少需要多少步胜利.(N<=10000) 解题过程: 1.看到N的范围比较小,先打个素数表,然后dp即 ...

  7. 《算法竞赛入门经典》5.12TeX括号

    /* *在TeX中,左双引号是``,右双引号是''.输入一篇包含双引号的文章,你的任务是把它转换成TeX的格式. *样例输入:"To be or not to be,"quoth ...

  8. Stern-Brocot树 及 法里级数分析

    Stern-Brocot树产生了所有分子分母互素的分数 从初始0/1 1/0 -> m/n m'/n'出发,不断往中间添加 (m+m')/(n+n')容易推得 n * m' - m * n' = ...

  9. HighAvailability和LoadBalancer

    HighAvailability                         LoadBalancer 红帽RHCS                                lvs(三种工作 ...

  10. android 之 XMLPull

    Pull解析 Pull的XML解析操作与SAX解析操作类似,也是采用事件驱动的方式.当XML文档开始解析或者遇到节点时都会有相应的事件代码触发. 主要涉及两个类: org.xmlpull.v1.Xml ...