poj1330

Nearest Common Ancestors

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 24762   Accepted: 12868

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

题解:

裸地lca

用倍增lca敲一下裸题

#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<<1];
int g[N][21],vis[N];
void dfs(int x,int de){
    for(int i=0;i<p[x].size();i++){
        if(!deep[p[x][i]]){
            deep[p[x][i]]=deep[x]+1;
            g[p[x][i]][0]=x;
            dfs(p[x][i],de+1);
        }
    }
}
int lca(int a,int b){
    if(deep[a]<deep[b]) swap(a,b);
    int t=deep[a]-deep[b];
    for(int i=0;i<=20;i++){
        if((1<<i)&t){
            a=g[a][i];
        }
    }
    if(a==b) return a;
    for(int i=20;i>=0;i--){
        if(g[a][i]!=g[b][i]){
            a=g[a][i];
            b=g[b][i];
        }
    }
    return g[a][0];
}
int main(){
    scanf("%d",&t);
    while(t--){
        memset(g,0,sizeof g);
        memset(p,0,sizeof p);
        memset(vis,0,sizeof vis);
        memset(deep,0,sizeof deep);
        scanf("%d",&n);
        for(int i=1,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=1;i<=n;i++){
            if(!vis[i]){//注意这是树,所以边是单向的,深搜的时候从根节点开始搜
                dfs(i,1);
                break;
            }
        }

        for(int j=1;j<=20;j++){
            for(int i=1;i<=n;i++){
                g[i][j]=g[g[i][j-1]][j-1];
            }
        }
        printf("%d\n",lca(cx,cy));
    }
    return 0;
}
时间: 2024-10-31 11:56:29

poj1330的相关文章

poj1330|bzoj3732|noip2013 货车运输 kruskal+倍增lca

学了一早上倍增,感觉lca还是tarjan好写. poj1330 1 #include <stdio.h> 2 #include <string.h> 3 #include <queue> 4 #include <algorithm> 5 #define DEG 20//2^20 6 #define maxn 10010 7 using namespace std; 8 struct node 9 { 10 int v, next; 11 }a[maxn*2

【POJ1330】Nearest Common Ancestors(树链剖分求LCA)

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

Nearest Common Ancestors&#183;POJ1330

传送门:http://poj.org/problem?id=1330 Nearest Common Ancestors Time Limit: 1000MS   Memory Limit: 10000K       Description A rooted tree is a well-known data structure in computer science and engineering. An example is shown below: In the figure, each n

POJ1330 Nearest Common Ancestors【最近公共祖先】【Tarjan-LCA算法】

Nearest Common Ancestors Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 19636Accepted: 10412 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

POJ1330 Nearest Common Ancestors

Nearest Common Ancestors Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24587   Accepted: 12779 Description A rooted tree is a well-known data structure in computer science and engineering. An example is shown below:  In the figure, eac

poj1330 lca 最近公共祖先问题学习笔记

首先推荐两个博客网址: http://dongxicheng.org/structure/lca-rmq/ http://scturtle.is-programmer.com/posts/30055.html [转]tarjan算法的步骤是(当dfs到节点u时): 1 在并查集中建立仅有u的集合,设置该集合的祖先为u 1 对u的每个孩子v:    1.1 tarjan之    1.2 合并v到父节点u的集合,确保集合的祖先是u 2 设置u为已遍历 3 处理关于u的查询,若查询(u,v)中的v已遍

LCA最近公共祖先(POJ1330)

题目链接:http://poj.org/problem?id=1330 解题报告: 先将一个子节点,深搜每一个根节点,并标记. 然后深索另一个子节点,当发现访问过了,就找到了最近的公共祖先. #include <iostream> #include <stdio.h> #include <string.h> using namespace std; const int maxn = 10005; bool vis[maxn]; int father[maxn]; int

算法复习——LCA模板(POJ1330)

题目: 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 ancesto

POJ1330(LCA入门题)

Nearest Common Ancestors Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 23388   Accepted: 12195 Description A rooted tree is a well-known data structure in computer science and engineering. An example is shown below: In the figure, each