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 ...
随机推荐
- CloudStack 4.2 与CloudStack 4.1二级存储API发生变化
CloudStack 4.1查看二级存储 http://192.168.150.16:8080/client/api?command=listHosts&response=json&s ...
- wikioi 3038 3n+1问题
题目描述 Description 3n+1问题是一个简单有趣而又没有解决的数学问题.这个问题是由L. Collatz在1937年提出的.克拉兹问题(Collatz problem)也被叫做hailst ...
- JSP+Servlet+JavaBean
MVC是三个单词的缩写:M,Model(模型):V,View( 视图 ),C,Control(控制). MVC模式的目的就是实现Web系统的职能分工, Model层:实现系统的业务逻辑,即javaBe ...
- Bit Twiddling Hacks
http://graphics.stanford.edu/~seander/bithacks.html Bit Twiddling Hacks By Sean Eron Andersonseander ...
- Vehicle Network Protocols -- ISO/KWP CAN CCD PCI SCI / SCP / Class 2
Vehicle Network Protocols There are 5 protocols in the OBD2 system and a car will normally only use ...
- Windows Server Backup备份Exchange2010
在Windows Server 2008 R2 SP1上Exchange2010 DAG备份测试成功: 1.分别在DAG成员服务器上安装WSB,不可以安装其命令行工具,因为其需要早期的PowerShe ...
- Android多线程研究(1)——线程基础及源代码剖析
从今天起我们来看一下Android中的多线程的知识,Android入门easy,可是要完毕一个完好的产品却不easy,让我们从线程開始一步步深入Android内部. 一.线程基础回想 package ...
- Codeforces Good Bye 2015 D. New Year and Ancient Prophecy 后缀数组 树状数组 dp
D. New Year and Ancient Prophecy 题目连接: http://www.codeforces.com/contest/611/problem/C Description L ...
- 使用TypeDescriptor给类动态添加Attribute
给类动态添加Attribute一直是我想要解决的问题,从msdn里找了很久,到Stack Overflow看了不少文章,算是最终有了答案. 先是有这样的一段解释 Attributes are stat ...
- ORA-01489: result of string concatenation is too long
ORA-01489: result of string concatenation is too long Cause: String concatenation result is more tha ...