LCA 最近公共祖先 (模板)
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <vector>
#define N 100005
using namespace std;
vector <int> vec[N] ;
vector <pair<int,int> > query[N];
struct node{
int first , second;
}e; vector <node> query[N]; int vis[N] , pre[N] , ans[N];
int Find(int x){
if(pre[x] == x){
return x;
}else{
pre[x] = Find(pre[x]);
return pre[x];
}
}
void dfs(int u , int fa){ pre[u] = u;
vis[u] = ;
for(int i = ; i < vec[u].size() ; i ++){
int v = vec[u][i];
if(v == fa) continue;
dfs(v , u);
} for(int i = ; i < query[u].size() ; i++){
int v = query[u][i].first;
int id = query[u][i].second;
if(vis[v] == ){
ans[id] = Find(v);
}
} pre[u] = fa;
} int main(){
int T;
scanf("%d" ,&T);
while(T --){
int n , x, y;
scanf("%d" , &n);
for(int i = ; i < n - ; i ++){
scanf("%d%d" , &x , &y);
vec[x].push_back(y);
vec[y].push_back(x);
vis[y] = ;
}
for(int i = ; i <= n ; i ++ ){
cout << i << "==========" << endl;
for(int k = ; k < vec[i].size() ; k ++){
cout << vec[i][k] << " ";
}
cout << endl;
}
int q;
scanf("%d",&q);
for(int i = ; i < q ; i ++){
scanf("%d%d" , &x , &y);
query[x].push_back({y , i});
query[y].push_back({x , i});
}
for(int i = ; i <= n ; i ++){
if(vis[i] == ){
memset(vis , ,sizeof(vis));
dfs(i , -);
break;
}
}
for(int i = ; i < q ; i ++){
printf("%d\n" ,ans[i]);
}
}
}
LCA 最近公共祖先 (模板)的更多相关文章
- LCA(最近公共祖先)模板
Tarjan版本 /* gyt Live up to every day */ #pragma comment(linker,"/STACK:1024000000,1024000000&qu ...
- LCA最近公共祖先模板(求树上任意两个节点的最短距离 || 求两个点的路进(有且只有唯一的一条))
原理可以参考大神 LCA_Tarjan (离线) TarjanTarjan 算法求 LCA 的时间复杂度为 O(n+q) ,是一种离线算法,要用到并查集.(注:这里的复杂度其实应该不是 O(n+q) ...
- LCA最近公共祖先模板代码
vector模拟邻接表: #include<iostream> #include<cstdio> #include<cstring> #include<cma ...
- lca最短公共祖先模板(hdu2586)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 #include<iostream> #include<cstdio> ...
- LCA(最近公共祖先)之倍增算法
概述 对于有根树T的两个结点u.v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u.v的祖先且x的深度尽可能大. 如图,3和5的最近公共祖先是1,5和2的最近公共祖先是4 在本篇中我们先介 ...
- lca 最近公共祖先
http://poj.org/problem?id=1330 #include<cstdio> #include<cstring> #include<algorithm& ...
- Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载)
Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载) 转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2 ...
- CodeVs.1036 商务旅行 ( LCA 最近公共祖先 )
CodeVs.1036 商务旅行 ( LCA 最近公共祖先 ) 题意分析 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从 ...
- LCA近期公共祖先
LCA近期公共祖先 该分析转之:http://kmplayer.iteye.com/blog/604518 1,并查集+dfs 对整个树进行深度优先遍历.并在遍历的过程中不断地把一些眼下可能查询到的而 ...
- LCA 近期公共祖先 小结
LCA 近期公共祖先 小结 以poj 1330为例.对LCA的3种经常使用的算法进行介绍,分别为 1. 离线tarjan 2. 基于倍增法的LCA 3. 基于RMQ的LCA 1. 离线tarjan / ...
随机推荐
- docker+mysql基本搭建过程
查询镜像 [root@bms-e4e3 ~]# docker search mysql INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED docker.i ...
- Python递归优化方法
递归栈溢出 Python的递归调用栈的深度有限制,默认深度为998,可以通过sys.getrecursionlimit()查看. 针对递归栈溢出,我们可以将默认深度设置为大一些,这样不会报错,但是再大 ...
- MySQL数据库的权限问题操作及基本增删改查操作
前面我们讲了mysql的基本内容,现在我们详细的了解一下mysql中的具体操作. what's the SQl SQL(Structured Query Language 即结构化查询语言) SQL语 ...
- 关于vue中eslint规范报错问题
/* global _ */这样 页面_就不会报错了
- GENIL_BOL_BROWSER, GENIL_MODEL_BROWSER,BSP_WD_CMPWB 使用方法
一:GENIL_BOL_BROWSER 使用方法 1: 进入x3c系统.输入T-CODE GENIL_BOL_BROWSER 2: 输入一个component set 名称 3: 选择一个对象,双 ...
- crm 理解
1:crm 就是一个 能够随时(通过labtop,mobile phone)掌握客户所有信息(过往的交易,)的工具. 通过足够的数据分析,能够更好的了解客户. 目的: a:使客户保留下来. b:赚取 ...
- Linux命令:tar命令批量解压方法总结
tar命令批量解压方法总结 (2010-05-24 17:48:46) 转载▼ 标签: tar 批量解压 杂谈 分类: linux学习 由于linux的tar命令不支持批量解压,所以很多网友编写了好多 ...
- Python 全栈开发八 文件处理
一.基本流程 打开文件得到文件句柄 将文件句柄赋值给一个变量 通过文件句柄对文件进行操作 关闭文件 二.基本操作 1.文件句柄 f = open("a.txt",encoding= ...
- SQL Server 2008 R2下载地址
MS 发布了最新的SQL Server 2008 R2,似乎早在4.19就提供了下载,不过才到昨天放出下载地址: 这个是试用版的下载,于正式版的区别就只在一个序列号! 而MSDN的版本则集成了安装序列 ...
- Java中通过Class类获取Class对象的方法详解
方式1:通过Object类的getObject()方法 Person p = new Person(); Class c = p.getClass(); 方式2: 通过 类名.class 获取到字节码 ...