首页 > 其他分享 >最近公共祖先

最近公共祖先

时间:2023-04-12 21:45:02浏览次数:34  
标签:idx 祖先 ne st int 最近 公共 include find

#include<iostream>
#include<vector>
#include<string.h>
using namespace std;

const int N=5e5+10,M=N*2;

typedef pair<int,int> PII;

int n,m,root;
int p[N];
int ans[N];
int h[N],e[M],ne[M],idx;
vector<PII> query[N];
bool st[N];

void add(int a,int b)
{
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}

int find(int x)
{
    if(x!=p[x]) p[x]=find(p[x]);
    return p[x];
}

void dfs(int u,int fa)
{
    st[u]=true;
    
    for(int i=h[u];~i;i=ne[i])
    {
        int j=e[i];
        if(j==fa) continue;
        dfs(j,u);
        p[j]=u;
    }
    
    for(auto x:query[u])
    {
        int v=x.first,i=x.second;
        if(st[v]) ans[i]=find(v);
    }
}

int main()
{
    scanf("%d%d%d",&n,&m,&root);
    
    memset(h,-1,sizeof h);
    
    for(int i=0;i<n-1;i++)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        add(a,b),add(b,a);
    }
    
    for(int i=1;i<=n;i++) p[i]=i;
    
    for(int i=1;i<=m;i++)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        query[a].push_back({b,i});
        query[b].push_back({a,i});
    }
    
    dfs(root,-1);
    
    for(int i=1;i<=m;i++)
    printf("%d\n",ans[i]);
    
    return 0;
}

 

标签:idx,祖先,ne,st,int,最近,公共,include,find
From: https://www.cnblogs.com/tolter/p/17311385.html

相关文章

  • 5752: 最长公共子序列 动态规划
    描述 一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列X=<x1,x2,…,xm>,则另一序列Z=<z1,z2,…,zk>是X的子序列是指存在一个严格递增的下标序列<i1,i2,…,ik>,使得对于所有j=1,2,…,k有:  Xij=Zj例如,序列Z=<B,C,D,B>是序列X=<A,B,C,B,D,A,B>的子......
  • Java构建树结构的公共方法
    一、前提pId需要传入用来确认第一级的父节点,而且pId可以为null。树实体类必须实现:TreeNode接口MyTreeVo必须有这三个属性:id、pId、children可以根据不同需求,配置TreeNode和MyTreeVo中固定的属性二、代码定义TreeNode接口publicinterfaceTreeNode{StringgetId(......
  • 235. 二叉搜索树的最近公共祖先
    给定一个二叉搜索树,找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树T的两个结点p、q,最近公共祖先表示为一个结点x,满足x是p、q的祖先且x的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉搜索树:root=[6,2,8,......
  • 华为OD机试 最近的点
    本期题目:最近的点题目同一个数轴x有两个点的集合A={A1,A2,...,Am}和B={B1,B2,...,Bm} A(i)和B(j)均为正整数 A、B已经按照从小到大排好序,A、B均不为空给定一个距离R正整数,列出同时满足如下条件的 (A(i),B(j))数对A(i)<=B(j)A(i),B(j)之间距离小于等于R在满足1,2的情......
  • 3500/05-01-03-00-00-00 能够有效地监控公共交通系统
    3500/05-01-03-00-00-00能够有效地监控公共交通系统在苏古尔的工作中16],开发了智能公交车站-乘客信息系统,以使管理员能够有效地监控公共交通系统,并使使用该系统的人能够同时观察关于这些车辆的位置和状态的信息。在所提出的解决方案中,基于嵌入式微型计算机的系统和数字监视器被......
  • 405 最长公共子序列 线性DP
    视频链接:https://www.bilibili.com/video/BV1EK411K7Eb/ #include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;constintN=1010;intn,m;chara[N],b[N];intf[N][N];intmain(){cin>>n>>m>>......
  • 最近公共祖先
    一、前言在一棵树上,一个节点的祖先定义为从根节点到这个节点的父亲节点的链上的所有点。两个节点的公共祖先为这两个节点对应的链重合部分上的所有点。两个节点的最近公共祖先为这两个节点对应的链重合部分上的所有点中深度最大的那个。容易知道树上任意两个点一定有且仅有一......
  • Question1:如何在Git中撤销最近的commit并重新执行add操作?「有问必答」
    你好,我是悦创。这是有问必答系列,你可以把你的问题在文章下评论,无论什么问题,我都会为你解答。如果你想撤销最近的一次提交并将更改重新放回暂存区(stagingarea),可以使用如下命令:gitreset--softHEAD^这将撤销最近的一次提交,同时保留更改在暂存区。之后,你可以使用gitadd将你想要......
  • EasyCVR在公共资源交易中心监控视频汇聚项目中的场景应用方案
    一、背景分析2019年5月,国务院办公厅印发了《国务院办公厅转发国家发展改革委关于深化公共资源交易平台整合共享实施意见的通知》(国办函〔2019〕41号),明确深化公共资源平台整合共享,要求地方各级人民政府制度细化落实工作方案,实现公共资源交易平台纵向全面贯通、横向互联互通,打造全区......
  • 代码随想录Day22-Leetcode235. 二叉搜索树的最近公共祖先,701.二叉搜索树中的插入操作,4
    235.二叉搜索树的最近公共祖先题目链接:https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/又玩了一天,手又生疏了好多;这道题看了题解,先用公共解法了,之前的题没刷,就给现在留坑了/***Definitionforabinarytreenode.*functionTree......