首先Tarjan算法的基本思路:

       1.任选一个点为根节点,从根节点开始。

      2.遍历该点u所有子节点v,并标记这些子节点v已被访问过。

      3.若是v还有子节点,继续搜索下去,否则下一步。

      4.合并v到u上。

      5.寻找与当前点u有询问关系的点v。

      6.若是v已经被访问过了,则可以确认u和v的最近公共祖先为v被合并到的父亲节点a。

  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. using namespace std;
  5.  
  6. const int N = ;
  7. const int M = ;
  8. int top,dad[N];
  9. bool used[N];
  10.  
  11. struct heads {
  12. int head;
  13. }v1[N],v2[N];
  14.  
  15. struct Edge {
  16. int v,next;
  17. }e1[M],e2[M];
  18.  
  19. void chu()
  20. {
  21. memset(v1,-,sizeof(v1));
  22. memset(v2,-,sizeof(v2));
  23. memset(dad,-,sizeof(dad));
  24. memset(used,,sizeof(used));
  25. }
  26.  
  27. int getdad(int x)
  28. {return dad[x] == - ? x : dad[x] = getdad(dad[x]);}
  29.  
  30. void Unions(int a,int b)
  31. {
  32. int r1=getdad(a);
  33. int r2=getdad(b);
  34. if(r1!=r2)
  35. dad[r2]=r1;
  36. }
  37.  
  38. void add1(int u,int v)
  39. {
  40. e1[top].v=v;
  41. e1[top].next=v1[u].head;
  42. v1[u].head=top++;
  43. }
  44.  
  45. void add2(int u,int v)
  46. {
  47. e2[top].v=v;
  48. e2[top].next=v2[u].head;
  49. v2[u].head=top++;
  50. }
  51.  
  52. void Tarjan(int u)
  53. {
  54. used[u]=true;
  55. for(int i=v2[u].head;i!=-;i=e2[i].next)
  56. {
  57. int v=e2[i].v;
  58. if(used[v])///无序输出
  59. printf("The LCA of (%d,%d) is -> %d\n",u,v,getdad(v));
  60. }
  61. for(int i=v1[u].head;i!=-;i=e1[i].next)
  62. {
  63. int v=e1[i].v;
  64. if(used[v])
  65. continue;
  66. Tarjan(v);
  67. Unions(u,v);
  68. }
  69. }
  70.  
  71. int main()
  72. {
  73. int n,m,u,v;///n个点,m条边,uv进行连接
  74. int q;///q次询问
  75. scanf("%d%d",&n,&m);
  76. chu();///初始化
  77. while(m--)
  78. {
  79. scanf("%d%d",&u,&v);
  80. add1(u,v),add1(v,u);
  81. }
  82. scanf("%d",&q);
  83. top=;
  84. while(q--)
  85. {
  86. scanf("%d%d",&u,&v);
  87. add2(u,v),add2(v,u);
  88. }
  89. Tarjan();
  90. return ;
  91. }

Tarjan求LCA胡乱写的板子 x的更多相关文章

  1. 倍增\ tarjan求lca

    对于每个节点v,记录anc[v][k],表示从它向上走2k步后到达的节点(如果越过了根节点,那么anc[v][k]就是根节点). dfs函数对树进行的dfs,先求出anc[v][0],再利用anc[v ...

  2. tarjan求lca的神奇

    题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...

  3. 【Tarjan】洛谷P3379 Tarjan求LCA

    题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...

  4. Tarjan求LCA

    LCA问题算是一类比较经典的树上的问题 做法比较多样 比如说暴力啊,倍增啊等等 今天在这里给大家讲一下tarjan算法! tarjan求LCA是一种稳定高速的算法 时间复杂度能做到预处理O(n + m ...

  5. 详解使用 Tarjan 求 LCA 问题(图解)

    LCA问题有多种求法,例如倍增,Tarjan. 本篇博文讲解如何使用Tarjan求LCA. 如果你还不知道什么是LCA,没关系,本文会详细解释. 在本文中,因为我懒为方便理解,使用二叉树进行示范. L ...

  6. 倍增 Tarjan 求LCA

                                                                                                         ...

  7. SPOJ 3978 Distance Query(tarjan求LCA)

    The traffic network in a country consists of N cities (labeled with integers from 1 to N) and N-1 ro ...

  8. Tarjan求LCA(离线)

    基本思想 把要求的点对保存下来,在dfs时顺带求出来. 方法 将每个已经遍历的点指向它回溯的最高节点(遍历它的子树时指向自己),每遍历到一个点就处理它存在的询问如果另一个点已经遍历,则lca就是另一个 ...

  9. 用tarjan求LCA板子(比倍增快)

    懒!!直接转载!!!! https://solstice23.top/archives/62

随机推荐

  1. linux 三剑客之sed常用总结

    sed 列出5-7行 [root@www ~]# nl /etc/passwd | sed -n '5,7p' -n不在处理前打印,搜索root,/p打印 nl /etc/passwd | sed ' ...

  2. nigx下配置tp5.1路由

    打开宝塔面板,找到你要配置路由的网站并找到配置文件(如图1) (图1) 2.在配置文件里添加一下代码 set $root = /www/wwwroot/www.blogs.test/public; # ...

  3. Mac OS 下定制终端颜色

    方法 有五种方法, 参考网站,我使用的是 Oh My Zsh 方案一:(通过 .bash_profile 文件自定制) 方案二:(也是修改 ~/.bash_profile) 方案三:(三方插件 Oh ...

  4. python基础数据类型之一

    python属于解释型(有良好的平台兼容性,在任何环境中都可以运行,修改代码的时候直接修改就可以,可以快速部署,不用停机维护).动态的(python在编程之前不需要提前设定好各种变量,C语言之类的需要 ...

  5. 今天发布MVC项目一直找不到页面

    刚开始以为是framwork版本太高,服务器没安装. 后面想到应用池版本忘记选了

  6. 订单支付倒计时-剩余时间xx小时xx分xx秒

    //<input type="hidden" id="endTime" value="1554912000000"> 结束时间 ...

  7. TIOBE 7月排行:Python 过分炒作,Perl 成受害者?

    与上个月相比,Python 的指数又增加了不少,由 8.530% 上升到 9.260%. 我们还留意到,TIOBE 对这期榜单的标题描述是“Perl is one of the victims of ...

  8. Get To Know Linux: The /etc/init.d Directory

    If you use Linux you most likely have heard of the init.d directory. But what exactly does this dire ...

  9. Linux SWAP交换分区维护

    1.查看当前swap分区信息

  10. tornada-基础

    回想Django的部署方式 以Django为代表的python web应用部署时采用wsgi协议与服务器对接(被服务器托管),而这类服务器通常都是基于多线程的,也就是说每一个网络请求服务器都会有一个对 ...