最近公共祖先(Tarjin)

【模板】最近公共祖先(LCA)

题目描述

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

输入格式

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

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

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

输出格式

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

样例 #1

样例输入 #1

5 5 4
3 1
2 4
5 1
1 4
2 4
3 2
3 5
1 2
4 5

样例输出 #1

4
4
1
4
4

提示

对于 30 % 30\% 30% 的数据, N ≤ 10 N\leq 10 N10 M ≤ 10 M\leq 10 M10

对于 70 % 70\% 70% 的数据, N ≤ 10000 N\leq 10000 N10000 M ≤ 10000 M\leq 10000 M10000

对于 100 % 100\% 100% 的数据, 1 ≤ N , M ≤ 500000 1 \leq N,M\leq 500000 1N,M500000 1 ≤ x , y , a , b ≤ N 1 \leq x, y,a ,b \leq N 1x,y,a,bN不保证 a ≠ b a \neq b a=b

样例说明:

该树结构如下:

第一次询问: 2 , 4 2, 4 2,4 的最近公共祖先,故为 4 4 4

第二次询问: 3 , 2 3, 2 3,2 的最近公共祖先,故为 4 4 4

第三次询问: 3 , 5 3, 5 3,5 的最近公共祖先,故为 1 1 1

第四次询问: 1 , 2 1, 2 1,2 的最近公共祖先,故为 4 4 4

第五次询问: 4 , 5 4, 5 4,5 的最近公共祖先,故为 4 4 4

故输出依次为 4 , 4 , 1 , 4 , 4 4, 4, 1, 4, 4 4,4,1,4,4

Java代码

import java.util.*;
import java.io.*;
class Point
{
    int y;
    int id;
    public Point(){}
    public Point(int y,int id)
    {
        this.y=y;
        this.id=id;
    }
}
public class Main
{
    public static int N=500010;
    public static int M=2*N;
    public static int n,m,s,idx;
    public static int[] h = new int[N];
    public static int[] e = new int[M];
    public static int[] ne = new int[M];
    public static int[] dist = new int[N];
    public static int[] p = new int[N];  //并查集
    public static int[] res = new int[N];
    public static int[] st = new int[N];
    public static ArrayList<ArrayList<Point>> query = new ArrayList<>();  //存询问
    public static void main(String[] args) throws IOException
    {
        StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
        PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
        in.nextToken();
        n=(int)in.nval;
        in.nextToken();
        m=(int)in.nval;
        in.nextToken();
        s=(int)in.nval;
        Arrays.fill(h,-1);
        for(int i=0;i<=n;i++)
            query.add(new ArrayList<>());
        for(int i=0;i<n-1;i++)  //建立边
        {
            in.nextToken();
            int a=(int)in.nval;
            in.nextToken();
            int b=(int)in.nval;
            add(a,b);
            add(b,a);
        }
        
        for(int i=0;i<m;i++)  //m组询问
        {
            in.nextToken();
            int a=(int)in.nval;
            in.nextToken();
            int b=(int)in.nval;
            if(a != b)
            {
                query.get(a).add(new Point(b,i));
                query.get(b).add(new Point(a,i));
            }
        }
        
        for(int i=1;i<=n;i++)  //初始化并查集
            p[i]=i;
            
        tarjan(s);
        
        for(int i=0;i<m;i++)
            out.println(res[i]);
            
        out.flush();
    }
    public static void add(int a,int b)
    {
        e[idx]=b;
        ne[idx]=h[a];
        h[a]=idx++;
    }
    public static void tarjan(int u)
    {
        st[u]=1;  //正在遍历
        for(int i=h[u];i!=-1;i=ne[i])
        {
            int j=e[i];
            if(st[j]==0)
            {
                tarjan(j);
                p[j]=u;
            }
        }
        
        //此时已到叶节点
        for(Point point : query.get(u))
        {
            int y=point.y;
            int id=point.id;
            
            if(res[id]!=0)  continue;  //如果已经回答过
            
            if(st[y]==2)  //如果已经回溯过
                res[id]=find(y);
        }
        
        st[u]=2;
    }
    public static int find(int x)
    {
        if(p[x]!=x) p[x]=find(p[x]);
        return p[x];
    }
}

S u b t a s k # 0 Subtask \#0 Subtask#0 过掉了,但是 S u b t a s k # 1 Subtask \#1 Subtask#1 R E RE RE

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/475712.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

十、MySQL主从架构配置

目录 一、资源配置 二、主从同步基本原理&#xff1a; 1、具体步骤&#xff1a; 2、数据库是靠什么同步的&#xff1f; 3、pos与GTID的区别&#xff1f; 三、配置一主两从 &#xff08;1&#xff09;为主库和从库创建复制账户&#xff0c; 分别在主从库上执行如下命令&a…

Chrome 114 带着侧边栏扩展来了

效果展示 manifest.json {"manifest_version": 3,"name": "ChatGPT学习","version": "0.0.2","description": "ChatGPT,GPT-4,Claude3,Midjourney,Stable Diffusion,AI,人工智能,AI","icons"…

健康星球乃幸福源泉:AI如何助力拯救环境

地球、环境和自然是有机融入的&#xff0c;自形成以来就一直维持着自我。看似如此有机的东西无需技术&#xff0c;但随着地球上发生的各种变化&#xff0c;我们却可以寄希望于人工智能&#xff08;AI&#xff09;帮助地球重回正轨&#xff0c;迎接幸福健康的千年。全球目标业已…

Stable Diffusion之核心网络结构解析

Stable Diffusion核心网络结构解析 1. SD模型整体架构初识 1. SD模型整体架构初识 Stable Diffusion模型整体上是一个End-to-End模型&#xff0c;主要由以下三个核心组件构成。 VAE&#xff08;变分自编码器&#xff0c;Variational Auto-Encoder&#xff09;&#xff0c;U-N…

带你玩透浮动float布局,详解(一)

文章目录 一 认识浮动二 浮动的规则浮动的规则一代码展示 浮动规则二代码展示 浮动规则四代码展示代码展示 浮动规则五 空隙的解决方案代码展示:第一种方式 放在一行第二种解决方式&#xff08;不推荐使用这种方式&#xff09;第三种方式采用浮动&#xff08;推荐&#xff0c;统…

ESP-IDF 外设SPI驱动

本文只是对ESP32S3的SPI使用进行简单的介绍&#xff0c;主要讲解基于ESP-IDF的四线标准SPI的简单使用。并不涉及非固定长度结构体、dummy位的使用、高速SPI以及其它类型的SPI工作模式。 更加专业的内容可以参考&#xff1a;SPI 主机驱动程序 SPI简介 SPI&#xff08;serial …

【JS】替换文本为emjio表情

最终效果展示 T1 T2 T3 T4 需求 把评论你好帅啊啊啊[开心][开心]&#xff0c;[开心] 替换为图片 思路 正则match提取[开心]到一个数组数组去重创建img标签img标签转文本. 。例&#xff1a;&#xff08;el.outerHTML&#xff09;&#xff0c;将el元素转文本字符串replaceAll…

TikTok运营要用什么样的IP?怎么选择?

对于运营TikTok的从业者来说&#xff0c;IP的重要性自然不言而喻。 在其他条件都正常的情况下&#xff0c;拥有一个稳定&#xff0c;纯净的IP&#xff0c;你的视频起始播放量很可能比别人高出不少&#xff0c;而劣质的IP轻则会限流&#xff0c;重则会封号。那么&#xff0c;如何…

jQuery 选择器--获取元素

文章目录 1 jQuery 基础选择器2 层级选择器3 隐式迭代(重要)4 jQuery 筛选选择器5 jQuery 筛选方法(重点)案例--下拉菜单 6 jQuery 排他思想*案例--左右Tab栏切换 7 jQuery 链式编程 1 jQuery 基础选择器 2 层级选择器 3 隐式迭代(重要) 示例&#xff1a; 4 jQuery 筛选选择器…

万亿参数大模型网络怎么建?GTC 2024立了个标杆

​多年来&#xff0c;NVIDIA一直在面向AI的数据中心方面布局&#xff0c;随着大模型与生成式AI的到来&#xff0c;NVIDIA也为大模型AI智算中心立了个Flag&#xff0c;这就是黄仁勋近两年来经常挂在嘴边上的“AI工厂”。 早在2022年9月的GTC大会上&#xff0c;黄仁勋就预测数据…

MavenGit

Maven Maven的功能 1.管理jar包 2.Maven也支持编译、测试、打包发布和安装等功能 Maven的下载安装 1.Maven官方地址&#xff1a;Maven – Download Apache Maven 2.Maven的配置 1&#xff09;配置环境变量 2&#xff09;配置本地仓库 3&#xff09;配置镜像 关于pom.…

每日一题 --- 27. 移除元素 - 力扣 [Go]

移除元素 题目&#xff1a; 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不…

视频素材库app哪里找?收藏以下短视频素材网站

嗨&#xff0c;视频创作达人们&#xff01;你们是不是在寻找那些高质量的视频素材库app&#xff1f;别担心&#xff0c;今天我就给你们推荐几个超棒的app&#xff0c;让你的视频创作更加出彩&#xff01; 蛙学网&#xff1a;视频素材库app推荐当然少不了蛙学网啦&#xff01;这…

图论基础|695. 岛屿的最大面积、1020. 飞地的数量、130. 被围绕的区域

695. 岛屿的最大面积 力扣题目链接(opens new window) 给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相邻的 1 (代表土地) 构成的组合&#xff0c;这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0&#xff0…

一、Java中SpringCloud组件集成接入【Nacos服务管理】

一、Java中SpringCloud组件集成接入【Nacos服务】 1.Nacos介绍2.搭建Nacos服务2.1Windows部署2.2Linux和Docker部署 3.Nacos可视化操作4.Java集成Nacos5.常见问题5.1将nacos变量读取到程序中作为全局变量 6.参考文章 1.Nacos介绍 Nacos是一个开源的动态服务发现、配置管理和服…

pyvista可视化加强版

增加了一个随机按钮&#xff0c;可以即时切换case可视化 import os import glob import randomimport pyvista as pvdef display_multi_meshes(meshes: list, titlesNone, point_size3, opacity0.9):num len(meshes)for i in range(num):pl.subplot(0, i)if i 2:pl.add_che…

动态规划--子序列问题(一)

一.什么是子序列问题 我们之前已经学习过子数组问题,子数组问题最大的特点就是求一段连续区间的xxxx,子数组问题的经典的状态表示就是以i位置为结束,xxxx,推导状态转移方程的一个经验是根据数组的结构来区分不同的结构 子序列问题本质上是对子数组问题的一个拓展,或者说子序列…

微信怎样群发更高效?

群发是指通过微信平台对特定受众进行大规模信息发布的过程&#xff0c;如节日祝福、活动促销等。随着科技的不断发展&#xff0c;群发的定义已不再仅限于手机信息群发或短信群发。如今&#xff0c;微信内置的群发功能也被广泛应用。 一、微信群发的操作步骤 1. 进入微信&…