最低公共祖先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/169022.html原文链接:https://javaforall.net

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


相关推荐

  • Java实现大整数乘法

    Java实现大整数乘法1问题描述计算两个大整数相乘的结果。2解决方案2.1蛮力法packagecom.liuzhen.chapter5;importjava.math.BigInteger;publicclassBigNumber{/**参数A:进行乘法运算的大整数A,用字符串形式表示*参数B:进行乘法运算的另一个大整数B,用字符串形式表示…

    2022年6月2日
    36
  • 程序员眼中的Program层次模型

    程序员眼中的Program层次模型

    2021年8月7日
    42
  • 股指期货跨期套利策略优化_股指期现套利策略盈亏

    股指期货跨期套利策略优化_股指期现套利策略盈亏股指期货跨期套利策略概述:本文章介绍使用同一标的不同交割日的股指期货的价差进行跨期套利的策略。本文由JoinQuant量化课堂推出,难度为进阶(下),深度为level-0。​作者:swlaw编辑

    2022年8月6日
    7
  • 免费的dns_常用的dns有哪些

    免费的dns_常用的dns有哪些国内部分常用免费DNS服务整理(2021-09) 名称 首选地址 备选地址 114DNS 114.114.114.114 114.114.115.115 阿里DNS 223.5.5.5 223.6.6.6 百度DNS 180.76.76.76 ipv6地址:2400:da00::6666 腾讯DNS(DNSPod) 119.29.29.29 119.28.28.28 腾讯DNS(DNSPod) 182.254.

    2025年9月7日
    6
  • 基于FPGA的SDRAM控制器设计(4)[通俗易懂]

    基于FPGA完整SDRAM控制器SDRAM控制器接口简述自动读写模块的框图SDRAM控制器完整代码SDRAM控制器的测试代码仿真结果SDRAM控制器接口简述完整的SDRAM控制器的模块框图如下:前面的三篇文章,我们已经简述了基本的SDRAM的基本操作。这里总结一下SDRAM的几个模块,SDRAM的上电初始化,自刷新、读写模块、顶层仲裁控制。了解了上面的操作,我们已经可以完成SDRAM控制器…

    2022年4月13日
    33
  • Centos7 安装yum源

    Centos7 安装yum源参考链接:https://www.cnblogs.com/guanbin-529/p/11980400.html一、安装wget的rpm包:1、下载wget的rpm包:首先去http://mirrors.163.com/centos/7/os/x86_64/Packages/下找到wget的rpm包,复制链接,使用curl命令下载:curlhttp://mirrors.163.com/centos/7/os/x86_64/Packages/wget-1.14-18.el7_6

    2022年6月4日
    189

发表回复

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

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