POJ 1330 Nearest Common Ancestors 【LCA模板题】
任意门:http://poj.org/problem?id=1330
Nearest Common Ancestors
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 34942 | Accepted: 17695 |
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
题意概括:
给一棵有N个节点,N-1条边的树 和 一对结点,求这对结点的最近公共祖先。
解题思路:
找根结点用一个标记数组
找公共祖先用简单粗暴的 Tarjan。
AC code:
1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 #include <cstring> 5 #include <vector> 6 #define INF 0x3f3f3f3f 7 #define LL long long 8 using namespace std; 9 const int MAXN = 1e4+5; 10 struct Edge{int v, next;}edge[MAXN<<1]; 11 int head[MAXN], cnt; 12 int fa[MAXN]; 13 bool in[MAXN]; 14 bool vis[MAXN]; 15 int N, M, S, ans, a, b; 16 17 inline void init() 18 { 19 memset(head, -1, sizeof(head)); 20 memset(vis, false, sizeof(vis)); 21 memset(in, false, sizeof(in)); 22 cnt = 0; 23 } 24 25 inline void AddEdge(int from, int to) 26 { 27 edge[cnt].v = to; 28 edge[cnt].next = head[from]; 29 head[from] = cnt++; 30 } 31 32 int findset(int x) 33 { 34 int root = x; 35 while(fa[root] != root) root = fa[root]; 36 37 int tmp; 38 while(fa[x] != root){ 39 tmp = fa[x]; 40 fa[x] = root; 41 x = tmp; 42 } 43 return root; 44 } 45 46 void Tarjan(int s) 47 { 48 fa[s] = s; 49 for(int i = head[s]; i != -1; i = edge[i].next){ 50 int Eiv = edge[i].v; 51 Tarjan(Eiv); 52 fa[findset(Eiv)] = s; 53 } 54 vis[s] = true; 55 if(s == a){ 56 if(vis[a] && vis[b]) ans = findset(b); 57 } 58 else if(s == b){ 59 if(vis[a] && vis[b]) ans = findset(a); 60 } 61 } 62 63 int main() 64 { 65 int T_case, u, v; 66 scanf("%d", &T_case); 67 while(T_case--) 68 { 69 init(); 70 scanf("%d", &N); 71 M = N-1; 72 for(int i = 1; i <= M; i++){ 73 scanf("%d %d", &u, &v); 74 AddEdge(u, v); 75 in[v] = true; 76 //AddEdge(v, u); 77 } 78 scanf("%d %d", &a, &b); 79 int root = 0; 80 for(int i = 1; i <= N; i++){ 81 if(!in[i]){root = i;break;} 82 } 83 Tarjan(root); 84 printf("%d\n", ans); 85 } 86 return 0; 87 }
View Code
转载于:https://www.cnblogs.com/ymzjj/p/9744229.html
POJ 1330 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 ...
- POJ 1330:Nearest Common Ancestors【lca】
题目大意:唔 就是给你一棵树 和两个点,问你这两个点的LCA是什么 思路:LCA的模板题,要注意的是在并查集合并的时候并不是随意的,而是把叶子节点合到父节点上 #include<cstdio&g ...
- POJ - 1330 Nearest Common Ancestors(树上倍增/树链剖分求LCA)
题目链接:点击查看 题目大意:给出一棵有根树,我们需要求出两个点的lca 题目分析:因为题目说了是有根树,所以我们在建图的时候直接建有向图就好了,并且记录一下每个点的入度,建完图后找一下入度为0的点, ...
- [POJ 1330] Nearest Common Ancestors (倍增法)
题目同上篇,最近公共祖先. 因为没有清零tot,RE了好多次TAT 一定要初始化啊!! 1 #include<cstdio> 2 #include<cstring> 3 #in ...
- POJ - 1330 Nearest Common Ancestors tanjan_LCA
传送门 题意就是题目 所谓在线,就是一个一个贼笨且时间太长. #include<stdio.h> #include<string.h> #include<iostream ...
- Nearest Common Ancestors(LCA板子)
题目链接:http://poj.org/problem?id=1330 Nearest Common Ancestors Time Limit: 1000MS Memory Limit: 1000 ...
- LCA——JD 3055 Nearest Common Ancestors
3055: Nearest Common Ancestors Time Limit: 1 Sec Memory Limit: 128 MB Description 给定N个节点的一棵树,有K次查询 ...
- JDOJ 3055: Nearest Common Ancestors
JDOJ 3055: Nearest Common Ancestors JDOJ传送门 Description 给定N个节点的一棵树,有K次查询,每次查询a和b的最近公共祖先. 样例中的16和7的公共 ...
最新文章
- puppet最新源码包安装学习笔记
- matlab摆线等时性程序,摆的等时性实验报告.doc
- Python入门100题 | 第015题
- word打开文档很久很慢_word文档打开特别慢怎么解决,word10打开文档很慢
- Codeforces Round #726 (Div. 2) E2. Erase and Extend (Hard Version) 贪心
- 关于ping命令的工作原理
- 流媒体通信协议HLS与DASH的对比
- 华为发布智简全光网战略,携手上下游重新定义光产业
- Qt文档阅读笔记-QML Canvas的官方解析及实例
- CSS Word的文档结构视图设计
- C# 7.0特性与vs2017
- 写的网页标题乱码,怎么办?
- 自然语言处理NLP星空智能对话机器人系列:理解语言的 Transformer 模型-子词分词器
- LR快捷键 之 图库模式
- 星际争霸2-数据编辑器-菜鸟入门
- 0x0报错解决--win11预览版升级报错0x0的快速解决方案
- 数学建模更新13(MATLAB绘制三维图【上】)
- gridview的ButtonField
- oracle监控pga,监控PGA最大空间、分配
- 三国刘备十大名言:三分天下要靠“混
热门文章
- HISTORY OF ETHEREUM SECURITY VULNERABILITIES, HACKS AND THEIR FIXES
- Xposed注入实现分析及免重启定制
- A wizard’s guide to Adversarial Autoencoders: Part 2, Exploring latent space with Adversarial Autoen
- python正则表达式实例教程_Python正则表达式经典入门教程
- JZOJ 5909. 【NOIP2018模拟10.16】跑商(paoshang)
- android 动态移动xy,android – 如何使用AChartEngine动态线图和X轴自动平移(滚动)?...
- redis 主从模式_Redis主从模式部署文档
- 图像数据流识别圆形_人工智能大赛视觉处理(一)图形识别
- 生物信息学(Bioinformatics)
- [codevs 1302] 小矮人(2002年CEOI中欧信息学奥赛)