LCA模板题
来源:互联网 发布:sql清空表中记录 编辑:程序博客网 时间:2024/06/05 21:53
难度 普及+/提高
题目描述
给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先。
输入输出格式
输入格式
第一行包含三个正整数N、M、S,分别表示树的结点个数、询问的个数和树根结点的序号。
接下来N-1行每行包含两个正整数x、y,表示x结点和y结点之间有一条直接连接的边(数据保证可以构成树)。
接下来M行每行包含两个正整数a、b,表示询问a结点和b结点的最近公共祖先。
输出格式
输出包含M行,每行包含一个正整数,依次为每一个询问的结果。
输入输出样例
输入样例
5 5 4
3 1
2 4
5 1
1 4
2 4
3 2
3 5
1 2
4 5
输出样例
4
4
1
4
4
样例说明
该树结构如下:
第一次询问:2、4的最近公共祖先,故为4。
第二次询问:3、2的最近公共祖先,故为4。
第三次询问:3、5的最近公共祖先,故为1。
第四次询问:1、2的最近公共祖先,故为4。
第五次询问:4、5的最近公共祖先,故为4。
故输出依次为4、4、1、4、4。
代码
#include<bits/stdc++.h>#define MN 500005using namespace std;int m,n,s,tot,dep[MN],up[MN][20];struct lll { int to; lll *ne; }a[2*MN];lll *head[MN];void DFS(int u){ for(int i=1;(1<<i)<=n;i++) { up[u][i]=up[up[u][i-1]][i-1]; } for(lll *e=head[u];e;e=e->ne) { if(dep[e->to]==-1) { dep[e->to]=dep[u]+1; up[e->to][0]=u; DFS(e->to); } } return;}int LCA(int u,int v){ if(dep[v]>dep[u]) swap(u,v); for(int i=19;i>=0;i--) { if(dep[up[u][i]]>=dep[v]) u=up[u][i]; } if(u==v) return v; for(int i=19;i>=0;i--) { if(up[u][i]!=up[v][i]) { u=up[u][i]; v=up[v][i]; } } return up[u][0];}int main(){ scanf("%d%d%d",&n,&m,&s); for(int i=1;i<n;i++) { int x,y; scanf("%d%d",&x,&y); a[++tot].ne=head[x]; head[x]=&a[tot]; a[tot].to=y; a[++tot].ne=head[y]; head[y]=&a[tot]; a[tot].to=x; } memset(dep,-1,sizeof(dep)); dep[s]=0; up[s][0]=0; DFS(s); for(int j=1;j<=m;j++) { int u,v; scanf("%d%d",&u,&v); printf("%d\n",LCA(u,v)); } return 0;}
感谢RWZ小朋友的代码资瓷
0 0
- poj1330 LCA模板题
- LCA模板题
- Poj1330 LCA模板题
- poj 1330 (LCA模板题)
- poj 1470(LCA模板题)
- 【LCA模板题】POJ 1330
- hdu 2586 lca模板题
- 【poj】lca模板题 poj1330
- LCA模板
- LCA模板
- LCA模板
- LCA 模板
- LCA模板
- LCA模板
- LCA模板
- 【模板】LCA
- LCA模板
- 模板--------LCA
- MySql中常见的异常代码及说明
- 495. Teemo Attacking【middle】&& 485. Max Consecutive Ones【easy】 02-24
- 部分和问题
- 第四章 Controller接口控制器详解(5)
- ffmpeg已支持解码avs2.0
- LCA模板题
- 无人机飞控
- 简单的Github用法
- pat-top 1005. Programming Pattern (35)
- Android 热修复原理
- 史上最全的 DB2 错误代码大全
- Android小项目之笑话大全(附源码)
- 20个常用正则表达式,以一当千
- 英文金曲大赛