acwing-1172. 祖孙询问(最近公共祖先)「建议收藏」

acwing-1172. 祖孙询问(最近公共祖先)「建议收藏」原题链接给定一棵包含 n 个节点的有根无向树,节点编号互不相同,但不一定是 1∼n。有 m 个询问,每个询问给出了一对节点的编号 x 和 y,询问 x 与 y 的祖孙关系。输入格式输入第一行包括一个整数 表示节点个数;接下来 n 行每行一对整数 a 和 b,表示 a 和 b 之间有一条无向边。如果 b 是 −1,那么 a 就是树的根;第 n+2 行是一个整数 m 表示询问个数;接下来 m 行,每行两个不同的正整数 x 和 y,表示一个询问。输出格式对于每一个询问,若 x 是 y 的祖先则输

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

原题链接

给定一棵包含 n 个节点的有根无向树,节点编号互不相同,但不一定是 1∼n。

有 m 个询问,每个询问给出了一对节点的编号 x 和 y,询问 x 与 y 的祖孙关系。

输入格式
输入第一行包括一个整数 表示节点个数;

接下来 n 行每行一对整数 a 和 b,表示 a 和 b 之间有一条无向边。如果 b 是 −1,那么 a 就是树的根;

第 n+2 行是一个整数 m 表示询问个数;

接下来 m 行,每行两个不同的正整数 x 和 y,表示一个询问。

输出格式
对于每一个询问,若 x 是 y 的祖先则输出 1,若 y 是 x 的祖先则输出 2,否则输出 0。

数据范围
1≤n,m≤4×104,
1≤每个节点的编号≤4×104
输入样例:

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

题解
倍增法求LCA

#include<bits/stdc++.h>
#define x first
#define y second
#define send string::npos
#define lowbit(x) (x&(-x))
#define left(x) x<<1
#define right(x) x<<1|1
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
typedef struct Node * pnode;
const int N = 2e5 + 10;
const int M = 3 * N;
const int INF = 0x3f3f3f3f;
const ll LINF = 0x3f3f3f3f3f3f3f3f;
const int Mod = 1e9;
int n,m;
int fa[N][16],depth[N];
int q[N],hh = 0,tt = 0;
int head[N],cnt;
struct Edge{ 
   
    int v,next;
}edge[M];
void add(int u,int v){ 
   
    edge[cnt].v = v;
    edge[cnt].next = head[u];
    head[u] = cnt ++;
}
void bfs(int root){ 
        //预处理
    memset(depth,INF,sizeof depth);
    q[0] = root;
    depth[0] = 0;
    depth[root] = 1,fa[root][0] = 0;
    while(hh <= tt){ 
   
        int t = q[hh ++];
        for(int i = head[t];~i;i = edge[i].next){ 
   
            int ver = edge[i].v;
            if(depth[ver] < depth[t] + 1)continue;
            depth[ver] = depth[t] + 1;
            q[++ tt] = ver;
            fa[ver][0] = t;
            for(int k = 1;k < 16;k ++){ 
   
                fa[ver][k] = fa[fa[ver][k - 1]][k - 1];
            }
        }
    }
}
int lca(int a,int b){ 
   
    if(depth[a] < depth[b])swap(a,b);
    for(int k = 15;k >= 0;k --)
        if(depth[fa[a][k]] >= depth[b])
            a = fa[a][k];
    if(a == b)return a;
    for(int k = 15;k >= 0;k --)
        if(fa[a][k] != fa[b][k]){ 
   
            a = fa[a][k];
            b = fa[b][k];
        }
    return fa[a][0];
}
int main(){ 
   
    memset(head,-1,sizeof head);
    int n,x,y,root;
    cin>>n;
    for(int i = 0;i < n;i ++){ 
   
        cin>>x>>y;
        if(y == -1)root = x;
        else{ 
   
            add(x,y);
            add(y,x);
        }
    }
    int m,a,b;
    cin>>m;
    bfs(root);
    for(int i = 0;i < m;i ++){ 
   
        cin>>a>>b;
        int res = lca(a,b);
        if(res == a)cout<<1<<endl;
        else if(res == b)cout<<2<<endl;
        else cout<<0<<endl;
    }
    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/169005.html原文链接:https://javaforall.net

(0)
上一篇 2022年8月9日 上午7:16
下一篇 2022年8月9日 上午7:36


相关推荐

  • 迅雷php文件怎么打开_php生成短链接

    迅雷php文件怎么打开_php生成短链接我正在使用TCPDF来创建简单的pdf文档.我正在创建一个页面并使用下面的代码添加链接$pdf->addTOCPage();$link=$pdf->AddLink();$pdf->SetLink($link,0,-1);现在链接设置成功.但是要导航到该页面我应该添加什么?我试过下面的代码,但它什么也没做,<ahref=“#Whattoaddhere”style…

    2025年10月1日
    3
  • md5使用方法 java_MD5在java中的使用

    md5使用方法 java_MD5在java中的使用MD5 是什么 MD5 是 message digestalgori 信息 摘要算法 的缩写 被广泛用于加密和解密技术上 它可以说是文件的 数字指纹 任何一个文件 无论是可执行程序 图像文件 临时文件或者其他任何类型的文件 也不管它体积多大 都有且只有一个独一无二的 MD5 信息值 并且如果这个文件被修改过 它的 MD5 值也将随之改变 因此 我们可以通过对比同一文件的 MD5 值 来校验这个文件是否

    2025年8月14日
    7
  • 大数据学习:Spark RDD操作入门

    大数据学习:Spark RDD操作入门

    2026年3月14日
    2
  • clion2021 激活码(最新序列号破解)

    clion2021 激活码(最新序列号破解),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
    171
  • 无锡“AI未来之城”:免费领“龙虾”Agent,最高补贴500万

    无锡“AI未来之城”:免费领“龙虾”Agent,最高补贴500万

    2026年3月15日
    3
  • JShell教程

    JShell教程什么是 JShellJShell 工具是一个命令行工具 通过提供 Java 编程语言元素的交互使用来促进探索性编程 JShell 是一个 REPL 读取 评估 打印循环 无论是学习 Java 语言还是探索陌生的代码 包括新的 JavaAPI 它都是理想的选择 典型的 Java 开发意味着编写一个完整的程序 然后对其进行编译 修复所有错误 运行它 找出问题所在 进行编辑和重复 使用 JShell 您可以一次输入一个程序元素 立即查看结果并进行相应调整 在开发过程中 可以将代码粘贴到 JShell 中 和 或将工作代码从 JSh

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号