[最近公共祖先] POJ 1330 Nearest Common Ancestors
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 27316 | Accepted: 14052 |
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<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int num,frist[20010],node[20010],deep[20010],ancestor[20010][17],n;
struct mp
{
int to,next;
}map[20010];
void init()
{
num=0;
memset(ancestor,0,sizeof(ancestor));
memset(frist,0,sizeof(frist));
memset(deep,0,sizeof(deep));
memset(node,0,sizeof(node));
memset(map,0,sizeof(map));
}
void add(int x,int y)
{
++num;
map[num].to=y;
map[num].next=frist[x];frist[x]=num;
}
void build(int v)
{
int i;
for(i=frist[v];i;i=map[i].next)
{
if(!deep[map[i].to])
{
ancestor[map[i].to][0]=v;
deep[map[i].to]=deep[v]+1;
build(map[i].to);
}
}
}
void init_ancestor()
{
int i,j;
for(j=1;j<17;++j)
for(i=1;i<=n;++i)
if(ancestor[i][j-1])
ancestor[i][j]=ancestor[ancestor[i][j-1]][j-1];
return;
}
int lca(int a,int b)
{
int i,dep;
if(deep[a]<deep[b]) swap(a,b);
dep=deep[a]-deep[b];
for(i=0;i<17;++i) if((1<<i)&dep) a=ancestor[a][i];
if(a==b) return a;
for(i=16;i>=0;--i)
{
if(ancestor[a][i]!=ancestor[b][i])
{
a=ancestor[a][i];
b=ancestor[b][i];
}
}
return ancestor[a][0];
}
int main()
{
int T,i,v,w,roof,qv,qw;
scanf("%d",&T);
while(T--)
{
init();
scanf("%d",&n);
for(i=0;i<n-1;++i)
{
scanf("%d%d",&v,&w);
add(v,w);add(w,v);
ancestor[w][0]=v;
if(!ancestor[v][0]) roof=v;//找根,根不同答案是不同的。
}
deep[roof]=1;
build(roof);
init_ancestor();
scanf("%d%d",&qv,&qw);
printf("%d\n",lca(qv,qw));
}
return 0;
}
[最近公共祖先] POJ 1330 Nearest Common Ancestors的更多相关文章
- 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)
POJ - 1330 Nearest Common Ancestors Time Limit: 1000MS Memory Limit: 10000KB 64bit IO Format: %l ...
- POJ 1330 Nearest Common Ancestors 倍增算法的LCA
POJ 1330 Nearest Common Ancestors 题意:最近公共祖先的裸题 思路:LCA和ST我们已经很熟悉了,但是这里的f[i][j]却有相似却又不同的含义.f[i][j]表示i节 ...
- POJ.1330 Nearest Common Ancestors (LCA 倍增)
POJ.1330 Nearest Common Ancestors (LCA 倍增) 题意分析 给出一棵树,树上有n个点(n-1)条边,n-1个父子的边的关系a-b.接下来给出xy,求出xy的lca节 ...
- LCA POJ 1330 Nearest Common Ancestors
POJ 1330 Nearest Common Ancestors Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 24209 ...
- POJ 1330 Nearest Common Ancestors(lca)
POJ 1330 Nearest Common Ancestors A rooted tree is a well-known data structure in computer science a ...
- POJ 1330 Nearest Common Ancestors 【LCA模板题】
任意门:http://poj.org/problem?id=1330 Nearest Common Ancestors Time Limit: 1000MS Memory Limit: 10000 ...
- POJ 1330 Nearest Common Ancestors 【最近公共祖先LCA算法+Tarjan离线算法】
Nearest Common Ancestors Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 20715 Accept ...
- poj 1330 Nearest Common Ancestors 求最近祖先节点
Nearest Common Ancestors Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 37386 Accept ...
随机推荐
- URL中文乱码处理总结(转)
转自:http://www.cnblogs.com/xirongliu/archive/2012/09/06/2674196.html 问题:传递中文参数的时候,接收页面出现乱码问题?当跨域操作,两套 ...
- sqlserver中对时间类型的字段转换
获取当前日期利用 convert 来转换成我们需要的datetime格式. select CONVERT(varchar(12) , getdate(), 112 ) 20040912-------- ...
- SQL语句实现取消自增列属性
SQL语句实现取消自增列属性 --由于在SQL-SERVER中,自增列属性不能直接修改,但可以通过以下方式变向实现 --1.如果仅仅是指定值插入,可用以下语句,临时取消 SET IDENTITY_IN ...
- 常见Oracle HINT的用法
1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化. 例如: SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_I ...
- StructureMap使用方法(转)
终于到了题目中的MVC使用StructureMap依赖注入的配置与实现了.在ASP.Net三层架构应用中StructureMap的是最老的IOC/DI工具,也就是依赖注入,很多线上的项目都使用了Str ...
- wex5 教程 之 图文讲解 可观察对象的集群应用与绑定技术
一 前言: wex5官方教程里,开篇即以一个input输入,output即时输出的例子,为我们展现了一个概念:可观察对象.在以后我的项目开发中,将大量运用可观察对象. 那么,问题来了: 1. 可观察对 ...
- 【转】SVN的dump文件导入
转载地址:http://erniu.sz.blog.163.com/blog/static/11517292220103282813176/ 把SVN的dump文件导入SVN数据库的方法: 在SVN ...
- 回传数据startActivityForResult()
1.调用者Activity01开启新的界面选用startActivityForResult(intent,requestCode);在Activity01中Intent intent=new Inte ...
- noi 666 放苹果
题目链接:http://noi.openjudge.cn/ch0206/666/ 和ural 1114题意类似,但是有顺序,5,1,1和1,5,1是同一种序列.不能直接枚举 d(i,j) 前 i 个盘 ...
- keyup与setInterval
<html><body> <input type="text" id="clock" size="35" /& ...