POJ 1330 Nearest Common Ancestors(在线倍增LCA)
2016-01-05 17:13
232 查看
Description
给出一棵n个节点的有向树,求两点u,v的最近公共祖先
Input
第一行为一整数T表示用例组数,每组用例第一行为一整数n表示节点数,之后n-1行每行两个整数a和b表示a到b有一条边,最后为两个整数u和v表示查询
Output
输出lca(u,v)
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
Solution
在线倍增lca
Code
给出一棵n个节点的有向树,求两点u,v的最近公共祖先
Input
第一行为一整数T表示用例组数,每组用例第一行为一整数n表示节点数,之后n-1行每行两个整数a和b表示a到b有一条边,最后为两个整数u和v表示查询
Output
输出lca(u,v)
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
Solution
在线倍增lca
Code
#include<cstdio> #include<iostream> #include<cstring> using namespace std; #define maxn 11111 struct node { int to,next; }edge[maxn]; int deep[maxn],p[maxn][55],vis[maxn],head[maxn],tot; void init() { tot=0; memset(head,-1,sizeof(head)); memset(vis,0,sizeof(vis)); memset(deep,0,sizeof(deep)); memset(p,-1,sizeof(p)); } void add(int u,int v) { edge[tot].to=v; edge[tot].next=head[u]; head[u]=tot++; } void dfs(int u) { vis[u]=1; for(int i=head[u];~i;i=edge[i].next) { int v=edge[i].to; if(!vis[v]) { deep[v]=deep[u]+1; dfs(v); } } } void rmq(int n) { for(int j=1;(1<<j)<=n;j++) for(int i=1;i<=n;i++) if(~p[i][j-1]) p[i][j]=p[p[i][j-1]][j-1]; } int lca(int a,int b) { int i,j; if(deep[a]<deep[b])swap(a,b); for(i=0;(1<<i)<=deep[a];i++); i--; for(j=i;j>=0;j--) if(deep[a]-(1<<j)>=deep[b]) a=p[a][j]; if(a==b)return a; for(j=i;j>=0;j--) if(p[a][j]!=-1&&p[a][j]!=p[b][j]) a=p[a][j],b=p[b][j]; return p[a][0]; } int main() { int T,n,u,v; scanf("%d",&T); while(T--) { init(); scanf("%d",&n); for(int i=1;i<n;i++) { scanf("%d%d",&u,&v); add(u,v); p[v][0]=u; } int root; for(int i=1;i<=n;i++) if(p[i][0]==-1) { root=i; deep[root]=1; break; } dfs(root); rmq(n); scanf("%d%d",&u,&v); printf("%d\n",lca(u,v)); } return 0; }
相关文章推荐
- Activity启动方式
- css3-列表
- okHttp封装使用
- apache开源项目--JMeter
- 数据库的实现法
- SQL大圣之路笔记——查询表所在的存储过程
- android 5.0以下版本使用atof报错解决
- 通过JS判断浏览器类型,详细区分IE各版本浏览器
- [细品java]ThreadLocal源码学习
- @Aspect @around 多个参数
- 单链表的基本操作
- SSL与TLS 区别 以及介绍
- C++ 虚函数、静态联编、动态联编
- Freemarker字符串连接
- 浅拷贝和深拷贝
- apache开源项目--Apache POI
- POSIX 消息队列基础知识复习,以及相关例程
- OpenSSL之AES加解密API使用
- h5
- magento两个比较好的运费插件