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 

234 233 
233 12 
233 13 
233 15 
233 19

输出





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(祖孙关系)相关推荐

  1. LCA ---- E. Tree Queries[LCA或者dfs序的解法]

    题目链接 题目大意:就是给你一颗树,然后qqq次询问每次询问会给出kkk个点,要求你判断一下这些点是否在存在一条从1到某个点u的链使得这k个点都在这条链上或者距离这条链距离为1的位置上 解法1:dfs ...

  2. Hadoop案例之单表关联输出祖孙关系

    1.案例描述 实例中给出child-parent(孩子--父母)表,要求输出grandchild-grandparent(孙子--爷奶)表. 样例输入如下所示. file: child       p ...

  3. 全志tina sys_config.fex和devices tree 的关系

    sys_config.fex是全志自己的配置信息文件(类似设备树) 编译过程中sys_config.fex最终会与设备树文件合并.sys_config.fex的优先级大于设备树. 合并后的设备树文件路 ...

  4. 【JZOJ3054】祖孙询问【LCA】

    题目大意: 题目链接:https://jzoj.net/senior/#main/show/3054 给出一棵有根树,询问xxx和yyy的祖孙关系. 思路: 水题. 直接求一遍lcalcalca,然后 ...

  5. 祖孙询问(LCA+倍增思想)

    1. 问题描述: 给定一棵包含 n 个节点的有根无向树,节点编号互不相同,但不一定是 1∼n.有 m 个询问,每个询问给出了一对节点的编号 x 和 y,询问 x 与 y 的祖孙关系. 输入格式 输入第 ...

  6. SPOJ - COT Count on a tree(LCA+主席树+离散化)

    题目链接:点击查看 题目大意:给出一棵树,每个点都有一个权值,现在给出m个询问,每次询问的格式是u,v,k,要求输出u-v这条路径上第k大的数 题目分析:一看到第k大的数就会想到主席树,既然是在树上的 ...

  7. 模板 - LCA最近公共祖先(倍增法、Tarjan、树上差分、LCA优化的次小生成树)

    整理的算法模板合集: ACM模板 注意x和y的LCA可以是x或者y本身 一.LCA的在线倍增算法 /*给定一棵包含 n个节点的有根无向树,有 m个询问,每个询问 给出了一对节点的编号 x和 y,询问 ...

  8. jzoj3054-祖孙询问【LCA】

    正题 题目大意 求两个点的祖孙关系. 解题思路 直接LCALCALCA,然后暴力判断. codecodecode #include<cstdio> #include<algorith ...

  9. LCA 最近公共祖先 详解

    一.内容 给定一棵包含 n 个节点的有根无向树,节点编号互不相同,但不一定是 1∼n.有 m 个询问,每个询问给出了一对节点的编号 x 和 y,询问 x 与 y 的祖孙关系.输入格式 输入第一行包括一 ...

最新文章

  1. linux vino vnc,vino-server和vncserver在教学环境中的典型应用
  2. java JDK 11.0.5的安装
  3. 两个等号(==)和三个等号(===)的区别
  4. winform在表格中输入一个完整的时间字段_B端交互组件之表格篇
  5. (转)mssql2005生成表字典
  6. C++常用字符串分割方法
  7. 腾讯车联发布TAI3.0:三步实现汽车智能进化,2个月快速上车
  8. 什么叫组网_家庭wifi,如何组网最合适
  9. AI变革下的“百度一下”
  10. linux程序中expr是什么意思,Linux中expr命令 (转)
  11. hbuilderx制作简单网页_普通网站如何制作一个网站?
  12. npm安装依赖包 版本冲突怎么办 --legacy-peer-deps的正确使用方法
  13. <<视觉问答>>2022:MuKEA: Multimodal Knowledge Extraction and Accumulation for Knowledge-based VQA
  14. linux截屏 保存目录,linux设置截屏图片的保存路径
  15. java毕业设计——基于Java+AI的五子棋游戏设计与实现(毕业论文+程序源码)——五子棋游戏
  16. win7开机卡在正在启动_电脑重装了系统,却卡在图标截面
  17. MySQL创建远程连接用户,使用远程工具连接数据库(详细)
  18. 驭势吴甘沙:我的根本利益|Xtecher人物特稿
  19. 每日新闻:华为发布5大AI战略;支付宝建议苹果用户调低免密支付额度;胡润百富榜:马云居首马化腾第三;微软重新推送新版Win10...
  20. 组策略应用—屏幕保护我做主

热门文章

  1. codeforces 757e Bash Plays with Functions
  2. Calendar日期类获取上月同期需求
  3. 《半小时漫画中国哲学史》读书摘记
  4. PyQt5最全39 表格之QTableView显示二维表数据
  5. Thinking in java生词
  6. 计算机网络知识面试常考
  7. Vue3初识 学习记录(一)
  8. win7 下安装vs2010 pro 失败解决方法
  9. DTOJ 4015: 永琳的竹林迷径
  10. 搭建xamppWeb服务器和TestLink、Mantis环境