Nearest Common Ancestors(LCA板子)
题目链接:http://poj.org/problem?id=1330
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 36918 | Accepted: 18495 |
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
Output
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<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板子)相关推荐
- poj 1330 Nearest Common Ancestors LCA/DFS
题目链接: http://poj.org/problem?id=1330 题意: 求出两点间的最近公共祖先. 题解: 第一种: 并查集维护:http://www.cnblogs.com/procedu ...
- POJ 1330 Nearest Common Ancestors / UVALive 2525 Nearest Common Ancestors (最近公共祖先LCA)...
POJ 1330 Nearest Common Ancestors / UVALive 2525 Nearest Common Ancestors (最近公共祖先LCA) Description A ...
- LCA——JD 3055 Nearest Common Ancestors
3055: Nearest Common Ancestors Time Limit: 1 Sec Memory Limit: 128 MB Description 给定N个节点的一棵树,有K次查询 ...
- POJ 1330 Nearest Common Ancestors 【LCA模板题】
任意门:http://poj.org/problem?id=1330 Nearest Common Ancestors Time Limit: 1000MS Memory Limit: 10000 ...
- JDOJ 3055: Nearest Common Ancestors
JDOJ 3055: Nearest Common Ancestors JDOJ传送门 Description 给定N个节点的一棵树,有K次查询,每次查询a和b的最近公共祖先. 样例中的16和7的公共 ...
- 【POJ - 1330】Nearest Common Ancestors(lca,模板题)
题干: A rooted tree is a well-known data structure in computer science and engineering. An example is ...
- POJ - 1330 Nearest Common Ancestors(树上倍增/树链剖分求LCA)
题目链接:点击查看 题目大意:给出一棵有根树,我们需要求出两个点的lca 题目分析:因为题目说了是有根树,所以我们在建图的时候直接建有向图就好了,并且记录一下每个点的入度,建完图后找一下入度为0的点, ...
- POJ 1330:Nearest Common Ancestors【lca】
题目大意:唔 就是给你一棵树 和两个点,问你这两个点的LCA是什么 思路:LCA的模板题,要注意的是在并查集合并的时候并不是随意的,而是把叶子节点合到父节点上 #include<cstdio&g ...
- POJ - 1330 Nearest Common Ancestors tanjan_LCA
传送门 题意就是题目 所谓在线,就是一个一个贼笨且时间太长. #include<stdio.h> #include<string.h> #include<iostream ...
最新文章
- Python3各种进制之间的转换方法
- 【数据结构与算法】之深入解析Base64编码的实现原理
- 数据结构题:由逆置数组方法——逆置线性表L的所有元素
- C# WPF文本框TextEdit不以科学计数法显示
- Visual Studio 2008 十大新功能
- 利用Packer自定义镜像创建容器集群
- mvvm怎么让光标制定属性的文本框_Word怎么快速制作斜线表头?10秒搞定,表格颜值直线上升...
- perl 字符串删除末尾几个字符_perl 第六弹 变量 II
- android eclipse不能创建activity,在eclipse里面开发android应用,不能新建Activity
- Qt widgets deeps--烧鸡
- 全栈JavaScript之路(十三)了解 ElementTraversal 规范
- HTTP Live Streaming直播
- 盛格塾丨品鉴《金石录后序》
- 羽毛球 - 正手高球(杀球、吊球、高远球)
- 若语句char a = ‘\72‘; 则变量a包含几个字符?‘\72‘是否在ASCII值的范围之内?
- AD19滴泪添加与删除
- 端午福利怎么发?苏宁大客户帮你“听取掌声一片”
- AEJoy ——表达式之彩色文字尾随特效【JS】
- android实现打电话功能,Android之简单实现拨打电话功能的方法
- Rocksdb加SPDK改善吞吐能力建设
热门文章
- 怎样在Xcode 4下编译发布与提交App到AppStore?(转)
- 使用 PDBDownloader 解决 IDA 加载 ntoskrnl.exe 时符号不完全问题
- Spring MVC 使用问题与解决--HTTP Status 500 - Servlet.init() for servlet springmvc threw exception
- win7 64位 VS2010调试提示“ORA-12154: TNS: 无法解析指定的连接标识符”的解决方法
- 【实践】Angel深度学习在广告推荐训练优化中的实践.pdf(附下载链接)
- 【报告分享】2021全球职场调研中国报告:期待与忐忑,职场人的心声-普华永道.pdf(附下载链接)...
- 【报告分享】2019-2020广告主KOL营销市场盘点及趋势预测.pdf(附下载链接)
- tensorboard 1.14.0 has requirement setuptools>=41.0.0, but you‘ll have setuptools 40.2.0
- 推荐系统实战第二部分 评价指标
- linux云服务器 个人,使用ownCloud在Linux安装你的个人云服务