POJ 1330(LCA/倍增法模板)
链接:http://poj.org/problem?id=1330
题意:q次询问求两个点u,v的LCA
思路:LCA模板题,首先找一下树的根,然后dfs预处理求LCA(u,v)
AC代码:
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<set>
#include<string>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
typedef long long ll;
const int maxbit = ;
const int maxn = 1e4+;
vector<int> G[maxn];
int depth[maxn];
int fa[maxn][maxbit];
int Log[maxn];
int N;
void pre(){
Log[] = -;
Log[] = ,Log[] = ;
for(int i = ;i<maxn;i++) Log[i] = Log[i/] + ;
}
void dfs(int cur,int father){//dfs预处理
depth[cur] = depth[father] + ;//当前结点的深度为父亲结点+1
fa[cur][] = father;//更新当前结点的父亲结点
for(int j = ;(<<j)<=N;j++){//倍增更新当前结点的祖先
fa[cur][j] = fa[fa[cur][j-]][j-];
}
for(int i = ;i<G[cur].size() ;i++){
if(G[cur][i] != father) {//dfs遍历
dfs(G[cur][i],cur);
}
}
}
int LCA(int u,int v){
if(depth[u]<depth[v]) swap(u,v);
int dist = depth[u] - depth[v];//深度差
while(depth[u]!=depth[v]){//把较深的结点u倍增到与v高度相等
u = fa[u][Log[depth[u]-depth[v]]];
}
if(u == v) return u;//如果u倍增到v,说明v是u的LCA
for(int i = Log[depth[u]];i>=;i--){//否则两者同时向上倍增
if(fa[u][i]!=fa[v][i]){//如果向上倍增的祖先不同,说明是可以继续倍增
u = fa[u][i];//替换两个结点
v = fa[v][i];
}
}
return fa[u][];//最终结果为u v向上一层就是LCA
}
int main()
{
int t;
pre();
scanf("%d",&t);
while(t--){
scanf("%d",&N);
int root ;
int in[maxn];
for(int i = ;i<maxn;i++){
G[i].clear() ;
}
memset(in,,sizeof(in));
int u,v;
for(int i = ;i<N-;i++){
scanf("%d%d",&u,&v);
in[v] = ;
G[u].push_back(v);
G[v].push_back(u);
}
for(int i = ;i<=N;i++){//寻树的根结点
if(in[i] == ) {
root = i;
break;
}
}
dfs(root,);
scanf("%d%d",&u,&v);
int ans = LCA(u,v);
printf("%d\n",ans);
}
return ;
}
POJ 1330(LCA/倍增法模板)的更多相关文章
- poj 1330 LCA (倍增+离线Tarjan)
/* 先来个倍增 */ #include<iostream> #include<cstring> #include<cstdio> #define maxn 100 ...
- POJ - 1330 Nearest Common Ancestors(dfs+ST在线算法|LCA倍增法)
1.输入树中的节点数N,输入树中的N-1条边.最后输入2个点,输出它们的最近公共祖先. 2.裸的最近公共祖先. 3. dfs+ST在线算法: /* LCA(POJ 1330) 在线算法 DFS+ST ...
- LCA(最近公共祖先)——LCA倍增法
一.前人种树 博客:最近公共祖先 LCA 倍增法 博客:浅谈倍增法求LCA 二.沙场练兵 题目:POJ 1330 Nearest Common Ancestors 代码: const int MAXN ...
- poj1470 LCA倍增法
倍增法模板题 #include<iostream> #include<cstring> #include<cstdio> #include<queue> ...
- luogu3379 【模板】最近公共祖先(LCA) 倍增法
题目大意:给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 整体步骤:1.使两个点深度相同:2.使两个点相同. 这两个步骤都可用倍增法进行优化.定义每个节点的Elder[i]为该节点的2^k( ...
- poj 1330 LCA最近公共祖先
今天学LCA,先照一个模板学习代码,给一个离线算法,主要方法是并查集加上递归思想. 再搞,第一个离线算法是比较常用了,基本离线都用这种方法了,复杂度O(n+q).通过递归思想和并查集来寻找最近公共祖先 ...
- hdu2586 lca倍增法
倍增法加了边的权值,bfs的时候顺便把每个点深度求出来即可 #include<iostream> #include<cstring> #include<cstdio> ...
- 最近公共祖先 LCA 倍增法
[简介] 解决LCA问题的倍增法是一种基于倍增思想的在线算法. [原理] 原理和同样是使用倍增思想的RMQ-ST 算法类似,比较简单,想清楚后很容易实现. 对于每个节点u , ancestors[u] ...
- POJ 1330 LCA裸题~
POJ 1330 Description A rooted tree is a well-known data structure in computer science and engineerin ...
随机推荐
- 快捷使用 Iterm2 连接SSH ( HTTP代理 )
1,配置iterm2 > Preferences.. > Profiles > 填写:name : 别名 : Command : expect /Users/jerryxu/wwwr ...
- Centos 7 配置 NFS
安装NFS包 yum install nfs-utils.x86_64 启动NFS服务需要首先启动rpcbind服务,这个rpcbind包已经在上面安装好了 先配置 /etc/exports 文件 v ...
- linux查看硬件、系统信息
查看机器型号等 dmidecode 是一个读取电脑 DMI(桌面管理接口(Desktop Management Interface))表内容并且以人类可读的格式显示系统硬件信息的工具.这个表包含系统硬 ...
- javascript当中arguments用法
8)arguments 例 3.8.1<head> <meta http-equiv="content-type" content="text/h ...
- [HNOI2015]接水果[整体二分]
[HNOI2015]接水果 给出一个树上路径集合\(S\) 多次询问\(x,y\)中的\(k\)小值 如果你问我数列上那么我会 树上的话 树上差分了吧直接?- 令 \(st_x<st_y\) 1 ...
- git Auto packing the repository in background for optimum performance
遇到问题: git本地仓库,如果长时间不进行清理,几个月以后的某一天,可能拉取代码的时候突然提示你 git Auto packing the repository in background for ...
- PAT (Basic Level) Practice (中文)1031 查验身份证 (15 分)
一个合法的身份证号码由17位地区.日期编号和顺序编号加1位校验码组成.校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8, ...
- js数据类型1
1. 分类(2大类) 基本(值)类型--5种 Number: 任意数值 String: 任意文本 Boolean: true/false undefined: undefined null: null ...
- Java String类型转换成Date日期类型
插入数据库时,存入当前日期,需要格式转换 import java.text.SimpleDateFormat; formatter = new SimpleDateFormat( "yyyy ...
- Linux的常用命令---这是对Linux最基本的尊重
Linux: 诞生日期:1991年 开发者:林纳斯·托瓦茨 特点:免费,开源 发行版本:centos|red Hat|Ubuntu|红旗等 思想:一切都是文件 重要文件目录 bin:二进制文件(命令) ...