C++——LCA例题——Tree(祖孙关系)
Tree(祖孙关系)
题目背景
SOURCE:NOIP2015-SHY-3
题目描述
已知一棵 n 个节点的有根树。有 m 个询问。每个询问给出了一对节点的编号 x 和 y ,询问 x 与 y 的祖孙关系。
输入格式
输入第一行包括一个整数 n 表示节点个数。
接下来 n 行每行一对整数对 a 和 b 表示 a 和 b 之间有连边。如果 b 是 -1 ,那么 a 就是树的根。
第 n+2 行是一个整数 m 表示询问个数。
接下来 m 行,每行两个正整数 x 和 y。
输出格式
对于每一个询问,输出 1 如果 x 是 y 的祖先;输出 2 如果 y 是 x 的祖先;否则输出 0 。
样例数据 1
输入
10
234 -1
12 234
13 234
14 234
15 234
16 234
17 234
18 234
19 234
233 19
5
234 233
233 12
233 13
233 15
233 19
输出
1
0
0
0
2
备注
【样例说明】
234 是 233 的祖先,19 是 233 的祖先。
【数据范围】
对 30% 的输入数据 :n,m≤1000
对 100% 的输入数据 :n,m≤40000,每个节点的编号都不超过 40000 。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<ctime>
using namespace std;
int n,m,root,tot,dist[50001],first[50001],next[50001],to[50001],f[50001][21],stack[50001];
inline void jian(int u,int v)
{to[++tot]=v;next[tot]=first[u];first[u]=tot;
}
inline void dfs()
{stack[1]=root;dist[root]=1;for(int l=1,k=1;l<=k;l++){int m=stack[l];for(int i=first[m];i;i=next[i]){dist[to[i]]=dist[m]+1;stack[++k]=to[i];}}
}
inline int lca(int x,int y)
{if(dist[x]<dist[y])swap(x,y);int foot=dist[x]-dist[y];for(int i=18;i>=0;i--)if(foot>=(1<<i)){foot-=(1<<i);x=f[x][i];}if(x==y)return x;for(int i=18;i>=0;i--)if(f[x][i]!=f[y][i]){y=f[y][i];x=f[x][i];}return f[x][0];
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){int x,y;scanf("%d%d",&x,&y);if(y!=-1){f[x][0]=y;jian(y,x);}else root=x;}dfs();for(int i=1;i<=18;i++)for(int j=1;j<=40000;j++)if(f[j][i-1])f[j][i]=f[f[j][i-1]][i-1];scanf("%d",&m);for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);if(x==y){cout<<"0"<<endl;continue;}int lcaa=lca(x,y);if(lcaa==x){cout<<"1"<<endl;continue;}if(lcaa==y){cout<<"2"<<endl;continue;}cout<<"0"<<endl;}return 0;
}
一个纯暴力60分代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;
int n,m,a,b,grand,p;
int father[40001];
int fuqin(int x,int y)
{if(father[x]!=grand)if(father[x]==y) return true;else fuqin(father[x],y);else return false;
}
int fu(int x,int y,int p)
{if(father[x]!=grand)if(father[x]==y) return true;else if(father[x]==p) return false;else fu(father[x],y,p);else return false;
}
int main()
{//freopen("1.in","r",stdin);ios::sync_with_stdio(false);cin.tie(NULL);cin>>n;for(int i=1;i<=n;i++){cin>>a>>b;father[a]=b;if(b==-1) grand=b;}cin>>m;for(int i=1;i<=m;i++){cin>>a>>b;p=father[a];if(fuqin(a,b)==false){if(fu(b,a,p)==false) cout<<"0"<<endl;else cout<<"1"<<endl;}else cout<<"2"<<endl;}return 0;
}
C++——LCA例题——Tree(祖孙关系)相关推荐
- LCA ---- E. Tree Queries[LCA或者dfs序的解法]
题目链接 题目大意:就是给你一颗树,然后qqq次询问每次询问会给出kkk个点,要求你判断一下这些点是否在存在一条从1到某个点u的链使得这k个点都在这条链上或者距离这条链距离为1的位置上 解法1:dfs ...
- Hadoop案例之单表关联输出祖孙关系
1.案例描述 实例中给出child-parent(孩子--父母)表,要求输出grandchild-grandparent(孙子--爷奶)表. 样例输入如下所示. file: child p ...
- 全志tina sys_config.fex和devices tree 的关系
sys_config.fex是全志自己的配置信息文件(类似设备树) 编译过程中sys_config.fex最终会与设备树文件合并.sys_config.fex的优先级大于设备树. 合并后的设备树文件路 ...
- 【JZOJ3054】祖孙询问【LCA】
题目大意: 题目链接:https://jzoj.net/senior/#main/show/3054 给出一棵有根树,询问xxx和yyy的祖孙关系. 思路: 水题. 直接求一遍lcalcalca,然后 ...
- 祖孙询问(LCA+倍增思想)
1. 问题描述: 给定一棵包含 n 个节点的有根无向树,节点编号互不相同,但不一定是 1∼n.有 m 个询问,每个询问给出了一对节点的编号 x 和 y,询问 x 与 y 的祖孙关系. 输入格式 输入第 ...
- SPOJ - COT Count on a tree(LCA+主席树+离散化)
题目链接:点击查看 题目大意:给出一棵树,每个点都有一个权值,现在给出m个询问,每次询问的格式是u,v,k,要求输出u-v这条路径上第k大的数 题目分析:一看到第k大的数就会想到主席树,既然是在树上的 ...
- 模板 - LCA最近公共祖先(倍增法、Tarjan、树上差分、LCA优化的次小生成树)
整理的算法模板合集: ACM模板 注意x和y的LCA可以是x或者y本身 一.LCA的在线倍增算法 /*给定一棵包含 n个节点的有根无向树,有 m个询问,每个询问 给出了一对节点的编号 x和 y,询问 ...
- jzoj3054-祖孙询问【LCA】
正题 题目大意 求两个点的祖孙关系. 解题思路 直接LCALCALCA,然后暴力判断. codecodecode #include<cstdio> #include<algorith ...
- LCA 最近公共祖先 详解
一.内容 给定一棵包含 n 个节点的有根无向树,节点编号互不相同,但不一定是 1∼n.有 m 个询问,每个询问给出了一对节点的编号 x 和 y,询问 x 与 y 的祖孙关系.输入格式 输入第一行包括一 ...
最新文章
- linux vino vnc,vino-server和vncserver在教学环境中的典型应用
- java JDK 11.0.5的安装
- 两个等号(==)和三个等号(===)的区别
- winform在表格中输入一个完整的时间字段_B端交互组件之表格篇
- (转)mssql2005生成表字典
- C++常用字符串分割方法
- 腾讯车联发布TAI3.0:三步实现汽车智能进化,2个月快速上车
- 什么叫组网_家庭wifi,如何组网最合适
- AI变革下的“百度一下”
- linux程序中expr是什么意思,Linux中expr命令 (转)
- hbuilderx制作简单网页_普通网站如何制作一个网站?
- npm安装依赖包 版本冲突怎么办 --legacy-peer-deps的正确使用方法
- <<视觉问答>>2022:MuKEA: Multimodal Knowledge Extraction and Accumulation for Knowledge-based VQA
- linux截屏 保存目录,linux设置截屏图片的保存路径
- java毕业设计——基于Java+AI的五子棋游戏设计与实现(毕业论文+程序源码)——五子棋游戏
- win7开机卡在正在启动_电脑重装了系统,却卡在图标截面
- MySQL创建远程连接用户,使用远程工具连接数据库(详细)
- 驭势吴甘沙:我的根本利益|Xtecher人物特稿
- 每日新闻:华为发布5大AI战略;支付宝建议苹果用户调低免密支付额度;胡润百富榜:马云居首马化腾第三;微软重新推送新版Win10...
- 组策略应用—屏幕保护我做主