Nearest Common Ancestors
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 24762   Accepted: 12868

Description

A rooted tree is a well-known data structure in computer science and engineering. An example is shown below:


In the figure, each node is labeled with an integer
from {1, 2,...,16}. Node 8 is the root of the tree. Node x is an ancestor of
node y if node x is in the path between the root and node y. For example, node 4
is an ancestor of node 16. Node 10 is also an ancestor of node 16. As a matter
of fact, nodes 8, 4, 10, and 16 are the ancestors of node 16. Remember that a
node is an ancestor of itself. Nodes 8, 4, 6, and 7 are the ancestors of node 7.
A node x is called a common ancestor of two different nodes y and z if node x is
an ancestor of node y and an ancestor of node z. Thus, nodes 8 and 4 are the
common ancestors of nodes 16 and 7. A node x is called the nearest common
ancestor of nodes y and z if x is a common ancestor of y and z and nearest to y
and z among their common ancestors. Hence, the nearest common ancestor of nodes
16 and 7 is node 4. Node 4 is nearer to nodes 16 and 7 than node 8 is.

For other examples, the nearest common ancestor of nodes 2 and 3 is node
10, the nearest common ancestor of nodes 6 and 13 is node 8, and the nearest
common ancestor of nodes 4 and 12 is node 4. In the last example, if y is an
ancestor of z, then the nearest common ancestor of y and z is y.

Write a
program that finds the nearest common ancestor of two distinct nodes in a tree.

Input

The input consists of T test cases. The number of test
cases (T) is given in the first line of the input file. Each test case starts
with a line containing an integer N , the number of nodes in a tree,
2<=N<=10,000. The nodes are labeled with integers 1, 2,..., N. Each of the
next N -1 lines contains a pair of integers that represent an edge --the first
integer is the parent node of the second integer. Note that a tree with N nodes
has exactly N - 1 edges. The last line of each test case contains two distinct
integers whose nearest common ancestor is to be computed.

Output

Print exactly one line for each test case. The line
should contain the integer that is the nearest common ancestor.

Sample Input

2
16
1 14
8 5
10 16
5 9
4 6
8 4
4 10
1 13
6 15
10 11
6 7
10 2
16 3
8 1
16 12
16 7
5
2 3
3 4
3 1
1 5
3 5

Sample Output

4
3

Source

 
题解:
裸地lca
用倍增lca敲一下裸题
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
#define N 10010
int n,t,cx,cy,deep[N];
vector<int>p[N<<];
int g[N][],vis[N];
void dfs(int x,int de){
for(int i=;i<p[x].size();i++){
if(!deep[p[x][i]]){
deep[p[x][i]]=deep[x]+;
g[p[x][i]][]=x;
dfs(p[x][i],de+);
}
}
}
int lca(int a,int b){
if(deep[a]<deep[b]) swap(a,b);
int t=deep[a]-deep[b];
for(int i=;i<=;i++){
if((<<i)&t){
a=g[a][i];
}
}
if(a==b) return a;
for(int i=;i>=;i--){
if(g[a][i]!=g[b][i]){
a=g[a][i];
b=g[b][i];
}
}
return g[a][];
}
int main(){
scanf("%d",&t);
while(t--){
memset(g,,sizeof g);
memset(p,,sizeof p);
memset(vis,,sizeof vis);
memset(deep,,sizeof deep);
scanf("%d",&n);
for(int i=,x,y;i<n;i++){
scanf("%d%d",&x,&y);
p[x].push_back(y);
vis[y]++;
}
scanf("%d%d",&cx,&cy);
for(int i=;i<=n;i++){
if(!vis[i]){//注意这是树,所以边是单向的,深搜的时候从根节点开始搜
dfs(i,);
break;
}
} for(int j=;j<=;j++){
for(int i=;i<=n;i++){
g[i][j]=g[g[i][j-]][j-];
}
}
printf("%d\n",lca(cx,cy));
}
return ;
}

poj1330的更多相关文章

  1. 【POJ1330】Nearest Common Ancestors(树链剖分求LCA)

    Description A rooted tree is a well-known data structure in computer science and engineering. An exa ...

  2. POJ1330 Nearest Common Ancestors (JAVA)

    经典LCA操作.. 贴AC代码 import java.lang.reflect.Array; import java.util.*; public class POJ1330 { // 并查集部分 ...

  3. LCA 离线的Tarjan算法 poj1330 hdu2586

    LCA问题有好几种做法,用到(tarjan)图拉算法的就有3种.具体可以看邝斌的博客.http://www.cnblogs.com/kuangbin/category/415390.html 几天的学 ...

  4. POJ1330 Nearest Common Ancestors

      Nearest Common Ancestors Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24587   Acce ...

  5. [POJ1330]Nearest Common Ancestors(LCA, 离线tarjan)

    题目链接:http://poj.org/problem?id=1330 题意就是求一组最近公共祖先,昨晚学了离线tarjan,今天来实现一下. 个人感觉tarjan算法是利用了dfs序和节点深度的关系 ...

  6. poj-1330(暴力写的lca)

    传送门 一看就是lca的板子题 然而 (写这个的时候我忘了怎么写lca) 于是我就试着写暴力了 本以为会tle结果e了一次后居然a掉了 开心到起飞.嘿嘿嘿 但还是格式输出错误了一次而且在ce之前也de ...

  7. POJ1330 Nearest Common Ancestors(最近公共祖先)(tarjin)

    A - Nearest Common Ancestors Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%lld &am ...

  8. LCA最近公共祖先(POJ1330)

    题目链接:http://poj.org/problem?id=1330 解题报告: 先将一个子节点,深搜每一个根节点,并标记. 然后深索另一个子节点,当发现访问过了,就找到了最近的公共祖先. #inc ...

  9. hdu2586&&poj1330 求点间最短距&&最近公共祖先(在线&&离线处理):::可做模板

    How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

随机推荐

  1. Jupyter增加内核

    本例的Jupyter安装在Python3下,以增加Python2内核为例. 首先确认在Python3下已安装了内核: ipython kernel install --user #or python3 ...

  2. ASP.NET MVC 修改视图的默认路径(MVC2,MVC3)

    ASP.NET MVC2 修改视图的默认路径 步骤:1.编写继承自WebFormViewEngine的类,重写视图路径 2.在Application_Start()中添加语句: ViewEngines ...

  3. ADO与ADO.NET的区别

    ADO是使用ole db接口并基于微软的COM技术,ADO.NET使用自己的ADO.NET接口并基于微软的.NET体系架构,所以ADO.NET与ADO是两种数据访问方式. ADO以recordset存 ...

  4. 大数据平台搭建(hadoop+spark)

    大数据平台搭建(hadoop+spark) 一.基本信息 1. 服务器基本信息 主机名 ip地址 安装服务 spark-master 172.16.200.81 jdk.hadoop.spark.sc ...

  5. js 函数的传值问题

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  6. Eclipse和Android Studio中的DDMS使用时什么不同?

    http://www.jb51.net/softjc/454131.html Eclipse和Android Studio中的DDMS使用时什么不同? 相信很多经常开发Android应用的朋友应该都接 ...

  7. DNS端口说明

    DNS服务器之间的区域复制需要使用TCP 53端口 客户端通过DNS服务器解析域名需要使用UDP 53端口 如果DNS转发配置未生效,则可尝试重启DNS服务

  8. Python-面向对象 (二 继承)

    一 继承   基类定义例如以下: class people:     #define attribute     name = ''     age  = 0     #define private ...

  9. 用ASP实现简单的繁简转换

    用ASP实现简单的繁简转换 国际化似乎是一个很流行的口号了,一个站点没有英文版至少也要弄个繁体版,毕竟都是汉字,翻译起来不会那么麻烦:P 一般的繁简转换是使用字典,通过GB的内码算出BIG5字符在字典 ...

  10. .net处理JSON简明教程

    .net处理JSON简明教程 Json.Net是.net中的一种流行的高性能的JSON框架. 特点 灵活的JSON序列化转化.net对象为JSON字符串.和把JSON字符串转换为.net对象. 手动读 ...