poj1330
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 24762 | Accepted: 12868 |
Description
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
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
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
#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的更多相关文章
- 【POJ1330】Nearest Common Ancestors(树链剖分求LCA)
Description A rooted tree is a well-known data structure in computer science and engineering. An exa ...
- POJ1330 Nearest Common Ancestors (JAVA)
经典LCA操作.. 贴AC代码 import java.lang.reflect.Array; import java.util.*; public class POJ1330 { // 并查集部分 ...
- LCA 离线的Tarjan算法 poj1330 hdu2586
LCA问题有好几种做法,用到(tarjan)图拉算法的就有3种.具体可以看邝斌的博客.http://www.cnblogs.com/kuangbin/category/415390.html 几天的学 ...
- POJ1330 Nearest Common Ancestors
Nearest Common Ancestors Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 24587 Acce ...
- [POJ1330]Nearest Common Ancestors(LCA, 离线tarjan)
题目链接:http://poj.org/problem?id=1330 题意就是求一组最近公共祖先,昨晚学了离线tarjan,今天来实现一下. 个人感觉tarjan算法是利用了dfs序和节点深度的关系 ...
- poj-1330(暴力写的lca)
传送门 一看就是lca的板子题 然而 (写这个的时候我忘了怎么写lca) 于是我就试着写暴力了 本以为会tle结果e了一次后居然a掉了 开心到起飞.嘿嘿嘿 但还是格式输出错误了一次而且在ce之前也de ...
- POJ1330 Nearest Common Ancestors(最近公共祖先)(tarjin)
A - Nearest Common Ancestors Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%lld &am ...
- LCA最近公共祖先(POJ1330)
题目链接:http://poj.org/problem?id=1330 解题报告: 先将一个子节点,深搜每一个根节点,并标记. 然后深索另一个子节点,当发现访问过了,就找到了最近的公共祖先. #inc ...
- hdu2586&&poj1330 求点间最短距&&最近公共祖先(在线&&离线处理):::可做模板
How far away ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
随机推荐
- 为什么SSL证书流量暴增?
网络服务提供商 Sandvine 近日发布了一份报告,中提到了一个非常有趣的现象:和去年的数据相比,加密网络流量(SSL)在今年正在呈现出爆发式增长. 这个变化在欧洲表现得十分明显:和去年的 1.47 ...
- undefined index : HTTP_RAW_POST_DATA
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...
- http://www.jobui.com/mianshiti/it/java/6782/
1.运算符优先级问题,下面代码的结果是多少?(笔试) package test; public class Test {public static void main(String[] args) { ...
- Codeforces Round #290 (Div. 2) A. Fox And Snake 水题
A. Fox And Snake 题目连接: http://codeforces.com/contest/510/problem/A Description Fox Ciel starts to le ...
- bzoj 2435: [Noi2011]道路修建 树上 dp
2435: [Noi2011]道路修建 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
- DirectSound的应用
假设仅仅使用PlaySound()这个API函数来表现声音效果的话,那么就无法表现出声音的混音效果,由于PlaySound在播放还有一个声音时,必定会导致现有声音的停止.因此,使用 PlaySound ...
- 一步步学Mybatis-告别繁琐的配置之Mybatis配置文件生成工具 (7)
今年是2013年的杀青之日,前几天由于比较忙,没有及时更新本篇的最后一篇东西,前六篇中我们主要都是采用手动配置相关的Mybatis映射文件与相应的接口类与实体类.当然如果在真正的使用过程中,由于业务的 ...
- 柯南君 :Oracle 分区技术 之 怎样支撑大数据操作?
前段时间.看了罗女士( 资深技术顾问 - Oracle 中国 顾问咨询部)关于<大批量数据处理技术的演讲>视频.感觉受益良多,结合多年的知识积累,柯南君给大家分享一下: 交流内容: 一.O ...
- 第三方Push服务:Urban Airship
转自:http://blog.csdn.net/kmyhy/article/details/7355756 关于推送通知,除了苹果的APNs之外,我们还有其它选择. Urban Airship就是其中 ...
- Java IO和Java NIO在文件拷贝上的性能差异分析
1. 在JAVA传统的IO系统中,读取磁盘文件数据的过程如下: 以FileInputStream类为例,该类有一个read(byte b[])方法,byte b[]是我们要存储读取到用户空间的缓冲区 ...