1. #include <iostream>
  2. #include <cstdio>
  3. #include <sstream>
  4. #include <cstring>
  5. #include <map>
  6. #include <set>
  7. #include <vector>
  8. #include <stack>
  9. #include <queue>
  10. #include <algorithm>
  11. #include <cmath>
  12. #define rap(i, a, n) for(int i=a; i<=n; i++)
  13. #define MOD 2018
  14. #define LL long long
  15. #define ULL unsigned long long
  16. #define Pair pair<int, int>
  17. #define mem(a, b) memset(a, b, sizeof(a))
  18. #define _ ios_base::sync_with_stdio(0),cin.tie(0)
  19. //freopen("1.txt", "r", stdin);
  20. using namespace std;
  21. const int maxn = 5e5 + , INF = 0x7fffffff;
  22. const int maxm = 1e6 + ;
  23. int n, m, cnt1, cnt2, c;
  24. int head1[maxm], head2[maxm], f[maxm], vis[maxm];
  25. int res[maxm];
  26.  
  27. struct node
  28. {
  29. int v, next;
  30. }Node[maxm];
  31.  
  32. struct edge
  33. {
  34. int v, id, next;
  35. }Edge[maxm];
  36.  
  37. void add1_(int u, int v)
  38. {
  39. Node[cnt1].v = v;
  40. Node[cnt1].next = head1[u];
  41. head1[u] = cnt1++;
  42. }
  43.  
  44. void add1(int u, int v)
  45. {
  46. add1_(u, v);
  47. add1_(v, u);
  48. }
  49.  
  50. void add2_(int u, int v, int id)
  51. {
  52. Edge[cnt2].v = v;
  53. Edge[cnt2].id = id;
  54. Edge[cnt2].next = head2[u];
  55. head2[u] = cnt2++;
  56. }
  57.  
  58. void add2(int u, int v, int id)
  59. {
  60. add2_(u, v, id);
  61. add2_(v, u, id);
  62. }
  63.  
  64. int find(int x)
  65. {
  66. return f[x]==x?x:(f[x] = find(f[x]));
  67. }
  68.  
  69. int lca(int u)//把整棵树的一部分看作以节点x为根节点的小树
  70. {
  71. f[u] = u; //由于节点u被看作是根节点,所以把u的father设为它自己
  72. vis[u] = ; //标记为已被搜索过
  73. for(int i=head1[u]; i!=-; i=Node[i].next) //遍历所有与x相连的节点
  74. {
  75. node e = Node[i]; //若未被搜索
  76. if(vis[e.v] == -)
  77. {
  78. lca(e.v); //以该节点为根节点搞小树
  79. f[e.v] = u; //回溯回来后更新子结点的f
  80. }
  81. }
  82. for(int i=head2[u]; i!=-; i=Edge[i].next) //搜索包含节点u的所有询问
  83. {
  84. edge e = Edge[i];
  85. if(vis[e.v] != -) //如果另一节点已被搜索过 只有另一结点被搜索过 那一条路径的f才会更新
  86. {
  87. int k = find(e.v); //寻找最近公共祖先
  88. res[e.id] = k;
  89. }
  90. }
  91. }
  92.  
  93. void init()
  94. {
  95. mem(head1, -);
  96. mem(head2, -);
  97. mem(res, -);
  98. mem(vis, -);
  99. cnt1 = cnt2 = ;
  100. }
  101.  
  102. int main()
  103. {
  104. while(scanf("%d%d%d", &n, &m, &c) != EOF)
  105. {
  106. init();
  107. int u, v;
  108. rap(i, , n-)
  109. {
  110. scanf("%d%d", &u, &v);
  111. add1(u, v);
  112. }
  113. rap(i, , m)
  114. {
  115. scanf("%d%d", &u, &v);
  116. add2(u, v, i);
  117. }
  118.  
  119. lca(c);
  120. rap(i, , m)
  121. {
  122. if(res[i] == -) printf("Not connected\n");
  123. else printf("%d\n", res[i]);
  124. }
  125. }
  126.  
  127. return ;
  128. }

tarjan求lca 模板的更多相关文章

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

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

  2. Tarjan求LCA(离线)

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

  3. 【Tarjan】洛谷P3379 Tarjan求LCA

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

  4. 倍增\ tarjan求lca

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

  5. Tarjan求LCA

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

  6. 倍增 Tarjan 求LCA

                                                                                                         ...

  7. 倍增求lca模板

    倍增求lca模板 https://www.luogu.org/problem/show?pid=3379 #include<cstdio> #include<iostream> ...

  8. 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 ...

  9. tarjan求lca的神奇

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

随机推荐

  1. 【LG3232】[HNOI2013]游走

    题面 洛谷 题解 代码 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstr ...

  2. CF 1025 D. Recovering BST

    D. Recovering BST http://codeforces.com/contest/1025/problem/D 题意: 给出一个连续上升的序列a,两个点之间有边满足gcd(ai ,aj) ...

  3. 非Contorller类使用@Service中的方法

    组件扫描这种的是指bean,跟service没关系 service只能在Controller类中使用,如果别的类想使用,必须使用下面这种方法 内容来源:https://blog.csdn.net/u0 ...

  4. 《Node.js 包教不包会》

    <Node.js 包教不包会> 为何写作此课程 在 CNode(https://cnodejs.org/) 混了那么久,解答了不少 Node.js 初学者们的问题.回头想想,那些问题所需要 ...

  5. 【转】 mysql使用federated引擎实现远程访问数据库(跨网络同时操作两个数据库中的表)

    原文转自:http://www.2cto.com/database/201412/358397.html 问题: 这里假设我需要在IP1上的database1上访问IP2的database数据库内的t ...

  6. python编码和小数据池

    python_day_6 一. 回顾上周所有内容一. python基础 Python是一门解释型. 弱类型语言 print("内容", "内容", end=&q ...

  7. 【转】RobotFrameWork+APPIUM实现对安卓APK的自动化测试----第二篇【原理】

    接着上一篇,我们开始聊聊APPIUM的框架和运行模式.废话不多说直接上图. 1.首先自动化脚本通过RobotFrameWork将命令传递给Appium的客户端: 2.然后[Appium的客户端]将接受 ...

  8. Jmeter直连postgresql数据库进行压测

    关于Jmeter直连数据库进行压测,网上有好多教程了,pg数据库的相对少一些,今天自己测试了下,还是挺简单的,有个别需要注意的地方.相较于Loadrunner这么全面庞大的压测工具,Jmeter在数据 ...

  9. Django-建立网页

    进入cmd模式做 django-admin startproject helloworld创建一个project,并命名helloworld,新生成的文件结构如下   输入python manage. ...

  10. Vue2 v-bind:href 中如何使用过滤器

    <a class="topic_title" v-bind:href="info.id|getTitleHref" v-bind:title=" ...