题目链接:http://poj.org/problem?id=1330

Nearest Common Ancestors
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 36918   Accepted: 18495

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

Taejon 2002
题目大意:输入T  T组样例  输入N  N个结点(1-N) 下面N-1行  每行两个数 u v  表示u是v的父亲  第N行表示询问 两个数的最近公共祖先
思路:不多说,完全板子
看代码:
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
const int maxn=1e4+50;
int N;//节点个数
vector<int>v[maxn];//树
vector<int> query[maxn];
int indeg[maxn];//节点的入度
int fa[maxn],deep[maxn],ancestor[maxn];//父亲 深度 祖先
bool vis[maxn];//是否被检查过
int root;
void Init()
{for(int i=1;i<=N;i++){v[i].clear();query[i].clear();indeg[i]=0;}return ;
}
void add_edge(int x,int y)
{v[x].push_back(y);indeg[y]++;return ;
}
void Input_query()
{int u,v;scanf("%d%d",&u,&v);query[u].push_back(v);//注意 两个都要存
    query[v].push_back(u);return ;
}
void Init_set()
{for(int i=1;i<=N;i++){fa[i]=i;ancestor[i]=i;deep[i]=0;}return ;
}
int Find(int x)
{return fa[x]==x?x:fa[x]=Find(fa[x]);
}
void Union(int u,int v)
{int du=Find(u);int dv=Find(v);if(du>dv){fa[dv]=du;return ;}else{fa[du]=dv;if(deep[du]==deep[dv]) deep[dv]++;}return ;
}
void Tarjan(int p)
{for(int i=0;i<v[p].size();i++)//遍历子树
    {Tarjan(v[p][i]);Union(p,v[p][i]);ancestor[Find(p)]=p;}vis[p]=true;for(int i=0;i<query[p].size();i++){if(vis[query[p][i]]){printf("%d\n",ancestor[Find(query[p][i])]);}}return ;
}
int main()
{int T;scanf("%d",&T);while(T--){scanf("%d",&N);Init();for(int i=1;i<N;i++){int u,v;scanf("%d%d",&u,&v);add_edge(u,v);}for(int i=1;i<=N;i++){if(indeg[i]==0){root=i;break;}}Input_query();Init_set();memset(vis,false,sizeof(vis));Tarjan(root);}return 0;
}

转载于:https://www.cnblogs.com/caijiaming/p/10763660.html

Nearest Common Ancestors(LCA板子)相关推荐

  1. poj 1330 Nearest Common Ancestors LCA/DFS

    题目链接: http://poj.org/problem?id=1330 题意: 求出两点间的最近公共祖先. 题解: 第一种: 并查集维护:http://www.cnblogs.com/procedu ...

  2. POJ 1330 Nearest Common Ancestors / UVALive 2525 Nearest Common Ancestors (最近公共祖先LCA)...

    POJ 1330 Nearest Common Ancestors / UVALive 2525 Nearest Common Ancestors (最近公共祖先LCA) Description A ...

  3. LCA——JD 3055 Nearest Common Ancestors

    3055: Nearest Common Ancestors Time Limit: 1 Sec   Memory Limit: 128 MB Description 给定N个节点的一棵树,有K次查询 ...

  4. POJ 1330 Nearest Common Ancestors 【LCA模板题】

    任意门:http://poj.org/problem?id=1330 Nearest Common Ancestors Time Limit: 1000MS   Memory Limit: 10000 ...

  5. JDOJ 3055: Nearest Common Ancestors

    JDOJ 3055: Nearest Common Ancestors JDOJ传送门 Description 给定N个节点的一棵树,有K次查询,每次查询a和b的最近公共祖先. 样例中的16和7的公共 ...

  6. 【POJ - 1330】Nearest Common Ancestors(lca,模板题)

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

  7. POJ - 1330 Nearest Common Ancestors(树上倍增/树链剖分求LCA)

    题目链接:点击查看 题目大意:给出一棵有根树,我们需要求出两个点的lca 题目分析:因为题目说了是有根树,所以我们在建图的时候直接建有向图就好了,并且记录一下每个点的入度,建完图后找一下入度为0的点, ...

  8. POJ 1330:Nearest Common Ancestors【lca】

    题目大意:唔 就是给你一棵树 和两个点,问你这两个点的LCA是什么 思路:LCA的模板题,要注意的是在并查集合并的时候并不是随意的,而是把叶子节点合到父节点上 #include<cstdio&g ...

  9. POJ - 1330 Nearest Common Ancestors tanjan_LCA

    传送门 题意就是题目 所谓在线,就是一个一个贼笨且时间太长. #include<stdio.h> #include<string.h> #include<iostream ...

最新文章

  1. Python3各种进制之间的转换方法
  2. 【数据结构与算法】之深入解析Base64编码的实现原理
  3. 数据结构题:由逆置数组方法——逆置线性表L的所有元素
  4. C# WPF文本框TextEdit不以科学计数法显示
  5. Visual Studio 2008 十大新功能
  6. 利用Packer自定义镜像创建容器集群
  7. mvvm怎么让光标制定属性的文本框_Word怎么快速制作斜线表头?10秒搞定,表格颜值直线上升...
  8. perl 字符串删除末尾几个字符_perl 第六弹 变量 II
  9. android eclipse不能创建activity,在eclipse里面开发android应用,不能新建Activity
  10. Qt widgets deeps--烧鸡
  11. 全栈JavaScript之路(十三)了解 ElementTraversal 规范
  12. HTTP Live Streaming直播
  13. 盛格塾丨品鉴《金石录后序》
  14. 羽毛球 - 正手高球(杀球、吊球、高远球)
  15. 若语句char a = ‘\72‘; 则变量a包含几个字符?‘\72‘是否在ASCII值的范围之内?
  16. AD19滴泪添加与删除
  17. 端午福利怎么发?苏宁大客户帮你“听取掌声一片”
  18. AEJoy ——表达式之彩色文字尾随特效【JS】
  19. android实现打电话功能,Android之简单实现拨打电话功能的方法
  20. Rocksdb加SPDK改善吞吐能力建设

热门文章

  1. 怎样在Xcode 4下编译发布与提交App到AppStore?(转)
  2. 使用 PDBDownloader 解决 IDA 加载 ntoskrnl.exe 时符号不完全问题
  3. Spring MVC 使用问题与解决--HTTP Status 500 - Servlet.init() for servlet springmvc threw exception
  4. win7 64位 VS2010调试提示“ORA-12154: TNS: 无法解析指定的连接标识符”的解决方法
  5. 【实践】Angel深度学习在广告推荐训练优化中的实践.pdf(附下载链接)
  6. 【报告分享】2021全球职场调研中国报告:期待与忐忑,职场人的心声-普华永道.pdf(附下载链接)...
  7. 【报告分享】2019-2020广告主KOL营销市场盘点及趋势预测.pdf(附下载链接)
  8. tensorboard 1.14.0 has requirement setuptools>=41.0.0, but you‘ll have setuptools 40.2.0
  9. 推荐系统实战第二部分 评价指标
  10. linux云服务器 个人,使用ownCloud在Linux安装你的个人云服务