任意门:http://poj.org/problem?id=1330

Nearest Common Ancestors

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 34942   Accepted: 17695

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

题意概括:

给一棵有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模板题】相关推荐

  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. POJ 1330:Nearest Common Ancestors【lca】

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

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

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

  5. [POJ 1330] Nearest Common Ancestors (倍增法)

    题目同上篇,最近公共祖先. 因为没有清零tot,RE了好多次TAT 一定要初始化啊!! 1 #include<cstdio> 2 #include<cstring> 3 #in ...

  6. POJ - 1330 Nearest Common Ancestors tanjan_LCA

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

  7. Nearest Common Ancestors(LCA板子)

    题目链接:http://poj.org/problem?id=1330 Nearest Common Ancestors Time Limit: 1000MS   Memory Limit: 1000 ...

  8. LCA——JD 3055 Nearest Common Ancestors

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

  9. JDOJ 3055: Nearest Common Ancestors

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

最新文章

  1. puppet最新源码包安装学习笔记
  2. matlab摆线等时性程序,摆的等时性实验报告.doc
  3. Python入门100题 | 第015题
  4. word打开文档很久很慢_word文档打开特别慢怎么解决,word10打开文档很慢
  5. Codeforces Round #726 (Div. 2) E2. Erase and Extend (Hard Version) 贪心
  6. 关于ping命令的工作原理
  7. 流媒体通信协议HLS与DASH的对比
  8. 华为发布智简全光网战略,携手上下游重新定义光产业
  9. Qt文档阅读笔记-QML Canvas的官方解析及实例
  10. CSS Word的文档结构视图设计
  11. C# 7.0特性与vs2017
  12. 写的网页标题乱码,怎么办?
  13. 自然语言处理NLP星空智能对话机器人系列:理解语言的 Transformer 模型-子词分词器
  14. LR快捷键 之 图库模式
  15. 星际争霸2-数据编辑器-菜鸟入门
  16. 0x0报错解决--win11预览版升级报错0x0的快速解决方案
  17. 数学建模更新13(MATLAB绘制三维图【上】)
  18. gridview的ButtonField
  19. oracle监控pga,监控PGA最大空间、分配
  20. 三国刘备十大名言:三分天下要靠“混

热门文章

  1. HISTORY OF ETHEREUM SECURITY VULNERABILITIES, HACKS AND THEIR FIXES
  2. Xposed注入实现分析及免重启定制
  3. A wizard’s guide to Adversarial Autoencoders: Part 2, Exploring latent space with Adversarial Autoen
  4. python正则表达式实例教程_Python正则表达式经典入门教程
  5. JZOJ 5909. 【NOIP2018模拟10.16】跑商(paoshang)
  6. android 动态移动xy,android – 如何使用AChartEngine动态线图和X轴自动平移(滚动)?...
  7. redis 主从模式_Redis主从模式部署文档
  8. 图像数据流识别圆形_人工智能大赛视觉处理(一)图形识别
  9. 生物信息学(Bioinformatics)
  10. [codevs 1302] 小矮人(2002年CEOI中欧信息学奥赛)