tarjan求lca 模板
- #include <iostream>
- #include <cstdio>
- #include <sstream>
- #include <cstring>
- #include <map>
- #include <set>
- #include <vector>
- #include <stack>
- #include <queue>
- #include <algorithm>
- #include <cmath>
- #define rap(i, a, n) for(int i=a; i<=n; i++)
- #define MOD 2018
- #define LL long long
- #define ULL unsigned long long
- #define Pair pair<int, int>
- #define mem(a, b) memset(a, b, sizeof(a))
- #define _ ios_base::sync_with_stdio(0),cin.tie(0)
- //freopen("1.txt", "r", stdin);
- using namespace std;
- const int maxn = 5e5 + , INF = 0x7fffffff;
- const int maxm = 1e6 + ;
- int n, m, cnt1, cnt2, c;
- int head1[maxm], head2[maxm], f[maxm], vis[maxm];
- int res[maxm];
- struct node
- {
- int v, next;
- }Node[maxm];
- struct edge
- {
- int v, id, next;
- }Edge[maxm];
- void add1_(int u, int v)
- {
- Node[cnt1].v = v;
- Node[cnt1].next = head1[u];
- head1[u] = cnt1++;
- }
- void add1(int u, int v)
- {
- add1_(u, v);
- add1_(v, u);
- }
- void add2_(int u, int v, int id)
- {
- Edge[cnt2].v = v;
- Edge[cnt2].id = id;
- Edge[cnt2].next = head2[u];
- head2[u] = cnt2++;
- }
- void add2(int u, int v, int id)
- {
- add2_(u, v, id);
- add2_(v, u, id);
- }
- int find(int x)
- {
- return f[x]==x?x:(f[x] = find(f[x]));
- }
- int lca(int u)//把整棵树的一部分看作以节点x为根节点的小树
- {
- f[u] = u; //由于节点u被看作是根节点,所以把u的father设为它自己
- vis[u] = ; //标记为已被搜索过
- for(int i=head1[u]; i!=-; i=Node[i].next) //遍历所有与x相连的节点
- {
- node e = Node[i]; //若未被搜索
- if(vis[e.v] == -)
- {
- lca(e.v); //以该节点为根节点搞小树
- f[e.v] = u; //回溯回来后更新子结点的f
- }
- }
- for(int i=head2[u]; i!=-; i=Edge[i].next) //搜索包含节点u的所有询问
- {
- edge e = Edge[i];
- if(vis[e.v] != -) //如果另一节点已被搜索过 只有另一结点被搜索过 那一条路径的f才会更新
- {
- int k = find(e.v); //寻找最近公共祖先
- res[e.id] = k;
- }
- }
- }
- void init()
- {
- mem(head1, -);
- mem(head2, -);
- mem(res, -);
- mem(vis, -);
- cnt1 = cnt2 = ;
- }
- int main()
- {
- while(scanf("%d%d%d", &n, &m, &c) != EOF)
- {
- init();
- int u, v;
- rap(i, , n-)
- {
- scanf("%d%d", &u, &v);
- add1(u, v);
- }
- rap(i, , m)
- {
- scanf("%d%d", &u, &v);
- add2(u, v, i);
- }
- lca(c);
- rap(i, , m)
- {
- if(res[i] == -) printf("Not connected\n");
- else printf("%d\n", res[i]);
- }
- }
- return ;
- }
tarjan求lca 模板的更多相关文章
- 详解使用 Tarjan 求 LCA 问题(图解)
LCA问题有多种求法,例如倍增,Tarjan. 本篇博文讲解如何使用Tarjan求LCA. 如果你还不知道什么是LCA,没关系,本文会详细解释. 在本文中,因为我懒为方便理解,使用二叉树进行示范. L ...
- Tarjan求LCA(离线)
基本思想 把要求的点对保存下来,在dfs时顺带求出来. 方法 将每个已经遍历的点指向它回溯的最高节点(遍历它的子树时指向自己),每遍历到一个点就处理它存在的询问如果另一个点已经遍历,则lca就是另一个 ...
- 【Tarjan】洛谷P3379 Tarjan求LCA
题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...
- 倍增\ tarjan求lca
对于每个节点v,记录anc[v][k],表示从它向上走2k步后到达的节点(如果越过了根节点,那么anc[v][k]就是根节点). dfs函数对树进行的dfs,先求出anc[v][0],再利用anc[v ...
- Tarjan求LCA
LCA问题算是一类比较经典的树上的问题 做法比较多样 比如说暴力啊,倍增啊等等 今天在这里给大家讲一下tarjan算法! tarjan求LCA是一种稳定高速的算法 时间复杂度能做到预处理O(n + m ...
- 倍增 Tarjan 求LCA
...
- 倍增求lca模板
倍增求lca模板 https://www.luogu.org/problem/show?pid=3379 #include<cstdio> #include<iostream> ...
- 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 ...
- tarjan求lca的神奇
题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...
随机推荐
- 【LG3232】[HNOI2013]游走
题面 洛谷 题解 代码 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstr ...
- CF 1025 D. Recovering BST
D. Recovering BST http://codeforces.com/contest/1025/problem/D 题意: 给出一个连续上升的序列a,两个点之间有边满足gcd(ai ,aj) ...
- 非Contorller类使用@Service中的方法
组件扫描这种的是指bean,跟service没关系 service只能在Controller类中使用,如果别的类想使用,必须使用下面这种方法 内容来源:https://blog.csdn.net/u0 ...
- 《Node.js 包教不包会》
<Node.js 包教不包会> 为何写作此课程 在 CNode(https://cnodejs.org/) 混了那么久,解答了不少 Node.js 初学者们的问题.回头想想,那些问题所需要 ...
- 【转】 mysql使用federated引擎实现远程访问数据库(跨网络同时操作两个数据库中的表)
原文转自:http://www.2cto.com/database/201412/358397.html 问题: 这里假设我需要在IP1上的database1上访问IP2的database数据库内的t ...
- python编码和小数据池
python_day_6 一. 回顾上周所有内容一. python基础 Python是一门解释型. 弱类型语言 print("内容", "内容", end=&q ...
- 【转】RobotFrameWork+APPIUM实现对安卓APK的自动化测试----第二篇【原理】
接着上一篇,我们开始聊聊APPIUM的框架和运行模式.废话不多说直接上图. 1.首先自动化脚本通过RobotFrameWork将命令传递给Appium的客户端: 2.然后[Appium的客户端]将接受 ...
- Jmeter直连postgresql数据库进行压测
关于Jmeter直连数据库进行压测,网上有好多教程了,pg数据库的相对少一些,今天自己测试了下,还是挺简单的,有个别需要注意的地方.相较于Loadrunner这么全面庞大的压测工具,Jmeter在数据 ...
- Django-建立网页
进入cmd模式做 django-admin startproject helloworld创建一个project,并命名helloworld,新生成的文件结构如下 输入python manage. ...
- Vue2 v-bind:href 中如何使用过滤器
<a class="topic_title" v-bind:href="info.id|getTitleHref" v-bind:title=" ...