最低公共祖先java_满族的祖先是

最低公共祖先java_满族的祖先是原题链接题目描述如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先。输入格式第一行包含三个正整数 N,M,SN,M,S,分别表示树的结点个数、询问的个数和树根结点的序号。接下来 N-1N−1 行每行包含两个正整数 x, yx,y,表示 xx 结点和 yy 结点之间有一条直接连接的边(数据保证可以构成树)。接下来 MM 行每行包含两个正整数 a, ba,b,表示询问 aa 结点和 bb 结点的最近公共祖先。输出格式输出包含 MM 行,每行包含一个正整数,依次为每一个询问的结果。输入

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

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

原题链接

题目描述
如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先。

输入格式
第一行包含三个正整数 N,M,SN,M,S,分别表示树的结点个数、询问的个数和树根结点的序号。

接下来 N-1N−1 行每行包含两个正整数 x, yx,y,表示 xx 结点和 yy 结点之间有一条直接连接的边(数据保证可以构成树)。

接下来 MM 行每行包含两个正整数 a, ba,b,表示询问 aa 结点和 bb 结点的最近公共祖先。

输出格式
输出包含 MM 行,每行包含一个正整数,依次为每一个询问的结果。

输入输出样例
输入

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

题解
Tarjan离线求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 = 5e5 + 10;
const int M = 3 * N;
const int INF = 0x3f3f3f3f;
const ll LINF = 0x3f3f3f3f3f3f3f3f;
const int Mod = 1e9;
vector<PII>query[N];
int fa[N],vis[N],res[N];
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 init(){ 
   
    for(int i = 0;i < N;i ++)fa[i] = i;
}
int Find(int x){ 
   
    return fa[x] = (fa[x] == x ? x : Find(fa[x]));
}
void Tarjan(int u,int f){ 
   
    vis[u] = true;
    for(auto &q : query[u]){ 
   
        int y = q.x,id = q.y;
        if(vis[y])res[id] = Find(y);    //如果之前遍历过另一个节点
    }
    for(int i = head[u];~i;i = edge[i].next){ 
   
        int ver = edge[i].v;
        if(ver == f)continue;
        Tarjan(ver,u);
        fa[ver] = u;
    }
}
int main(){ 
   
    memset(head,-1,sizeof head);
    init();
    int n,m,root,x,y;
    cin>>n>>m>>root;
    for(int i = 0;i < n - 1;i ++){ 
   
        cin>>x>>y;
        add(x,y);
        add(y,x);
    }
    for(int i = 0;i < m;i ++){ 
   
        cin>>x>>y;
        query[x].push_back({ 
   y,i});
        query[y].push_back({ 
   x,i});
    }
    Tarjan(root,-1);
    for(int i = 0;i < m;i ++)cout<<res[i]<<endl;

    return 0;
}

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 银行账户管理系统详细设计说明书

    银行账户管理系统详细设计说明书银行账户管理系统详细设计,附源码于博主的GitHub个人主页中。

    2022年6月11日
    45
  • xcopy-参数详解

    xcopy-参数详解XCOPY——目录复制命令 1.功能:复制指定的目录和目录下的所有文件连同目录结构。 2.类型:外部命令 3.格式:XCOPY[源盘:]〈源路径名〉[目标盘符:][目标

    2022年7月1日
    27
  • Java dom4j生成和解析XML

    Java dom4j生成和解析XMLdom4j使用:需先导入dom4j对应的jar,本章用的是dom4j-1.6.1.jar优点:DOM4J使Java开发的灵活性和XML解析代码易于维护dom4j相关操作类Document:表示整个xml文档,是一个树形结构Eelment:表示一个xml的元素,提供方法操作其子元素,它的文本,属性和名称空间Attribute:表示元素的属性Node:表示元素,属性do…

    2022年6月21日
    29
  • 卸载pycharm重新安装_ubuntu卸载pycharm

    卸载pycharm重新安装_ubuntu卸载pycharm1.安装包下载下载地址https://www.jetbrains.com/pycharm/download/#section=linux社区版是免费的,不需要支付额外的费用,但是功能略微筛选,适合于学生群体,而专业版需要支付一定的费用,功能比较多,适用于企业,但整体的安装过程相同。2.安装在安装包过程启动终端命令,解压缩下载后的安装包修改自己的安装包版本号即可$tar-zxvfpycharm-professional-2021.3.1.tar.gz将解压缩后的目录移动到/

    2022年8月29日
    2
  • 初中基础学java_初中生也能学JAVA吗?[通俗易懂]

    初中基础学java_初中生也能学JAVA吗?[通俗易懂]初中生当然可以学java,初中正是学习力非常强的时期。如果你对计算机有兴趣,就去学啊。现在不是每个人都能明白自己的兴趣点在哪里的。但是由于孩子的年龄太小,自学能力的不足,找一个靠谱的学校从师而学才是正经的学习途径。北大青鸟沈阳三好就有专门为初中生开设的计算机课程,充分地体谅学生的学习情况以及学习基础,所以不用担心自己跟不上进度。Java自1995年问世以来,已历经21年的岁月。20年来,不管IT技…

    2022年7月7日
    27

发表回复

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

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