首页 > 其他分享 >2167 - 树的公共祖先(LCA)

2167 - 树的公共祖先(LCA)

时间:2023-07-25 21:16:10浏览次数:40  
标签:结点 祖先 公共 int LCA 2167 输入 105

题目描述

给定一棵树和两个不同的结点,求出他们最近的公共祖先父结点。

已知该树有 n 个结点,标号 1..n 。

输入

第 1 行输入一个整数 nn,代表结点数量(n≤100)

第 2 行输入两个整数 x,yx,y,表示需要计算的结点;

以下 n−1 行,每行两个整数 a 和 b,表示 a 的父结点是 b。

输出

输出 x 与 y 的最近公共祖先 root。

样例

输入

复制
9
9 7
2 1
3 2
4 2
5 3
8 5
9 5
6 4
7 4

输出

复制
2

首先,这题只需要分别从x和y往上进行搜索,路线产生的第一个交点就是答案
说人话就是vis记录路径然后判断什么时候重合
代码很短:
#include<iostream>
#include<vector>
using namespace std;
int root,fa[105];
int n,a,b,x,y;
bool vis[105];
//可以用vector但是没必要
// vector <int> q[105];
int main(){
    scanf("%d%d%d",&n,&x,&y);
    //并查集fa数组初始化
    for(int i=1;i<=n;i++)fa[i]=i;
    for(int i=1;i<=n-1;i++){
        scanf("%d%d",&a,&b);
        fa[a]=b;
    }
    //防止数据阴人
    if(x==y){
        printf("%d",x);
        return 0;
    }
    //标记x走过
    vis[x]=1;
    //找每一个x的父亲
    while(fa[x]!=x){
        x=fa[x];
        vis[x]=1;
    }
    //然后从y开始往上找
    while (fa[y]!=y)
    {
        y=fa[y];
        if(vis[y]==1){
            cout<<y;
            break;
        }
    }
    return 0;
}

 

 

标签:结点,祖先,公共,int,LCA,2167,输入,105
From: https://www.cnblogs.com/Ghost1GM/p/17581012.html

相关文章

  • 【模板】最近公共祖先(LCA)
    postedon2021-08-0414:22:40|under学术|sourceLCA,LeastCommonAncestors,最近公共祖先。倍增。首先预处理出数组\(d_i\)和\(f_{i,j}\)。\(d_i\)表示第\(i\)个节点的深度。转移方程:\(d_{i}=d_{\text{fa}}+1\)\(f_{i,j}\)表示第\(i\)个节点的第\(2^j\)级......
  • GlobalCache 工具类
    packagecom.neo.config;importorg.springframework.stereotype.Component;importjava.util.Map;importjava.util.concurrent.ConcurrentHashMap;importjava.util.concurrent.Executors;importjava.util.concurrent.ScheduledExecutorService;importjava.util.concurren......
  • position为absolute的元素的生成盒的包含块是其position为absolute、relative、fixed
     蓝色区域为.parent的contentbox。由此可以看出,规范中所说的,若某元素的position为absolute,其视口应该为其第一个position为absolute、relative或fixed的祖先元素的内容边界,而不是内边距边界。......
  • 最近公共祖先(LCA)
    向上标记法时间复杂度:$O(n)$待查询点为a和b,首先从a点向根节点进行搜索,将路径上的点进行标记,再从b点向根节点进行搜索,同时检测路径上的点是否被标记过,第一次检测到的点即为a,b两点的最近公共祖先倍增时间复杂度预处理:$O(nlog_n)$查询:$O(log_n)$相关概念及性质节点祖先:从......
  • 冷门科技 —— DFS 序求 LCA
    Updateon2023.7.17:该技巧目前已知的最早来源:skip2004。Updateon2023.7.17:比较时,取时间戳较小的结点也是正确的,不用记录深度。DFS序求LCA无论是从时间常数,空间常数还是好写程度方面均吊打欧拉序。定义DFS序表示对一棵树进行深度优先搜索得到的结点序列,而时间戳DFN......
  • LCA 离线tarjan算法
    tarjan算法是离线算法,它必须先将所有的要查询的点对存起来,然后在搜的时候输出结果。tarjan算法很经典,因为算法的思想很巧妙,利用了并查集思想,在dfs下,将查询一步一步的搜出来。伪代码如下:可以看到,对于我们已经保存好的查询,假设为(u,v),u为此时已经搜完的子树的根节点,v的位置就只有两种......
  • 最近公共祖先(LCA)
    最近公共祖先(LCA)主要思路:一个节点的\(2^n\)的祖先是那个节点\(2^{n-1}\)的祖先的\(2^{n-1}\)的祖先也就是说\(f[x][n]=f[f[x][n-1]][n-1]\)还要计算\(log_2\)的值,记录深度#include<bits/stdc++.h>usingnamespacestd;constintMAXN=5e5+10;intfa[MAXN][30],lg[M......
  • 1644 题「二叉树的最近公共祖先 II
    对于这道题来说,p和q不一定存在于树中,所以你不能遇到一个目标值就直接返回,而应该对二叉树进行完全搜索(遍历每一个节点),如果发现p或q不存在于树中,那么是不存在LCA的。  ......
  • 题:二叉树中m是n的祖先,通过(后序遍历)可以找到m到n的路径
     选项:先序?中序?后序?层次? 题解:1.首先是对路径的解释:访问一个结点x时,栈中结点恰好是x结点的所有祖先,从栈底到栈顶所有结点加上x结点,就构成了从根结点到x结点的一条路径。2.分析:为什么不是先序遍历?(第一次做题时以为这个路径指的是遍历的结果,那先序自然就满足,但这个路径不是遍历......
  • LeetCode 235. 二叉搜索树的最近公共祖先
    题目链接:LeetCode235.二叉搜索树的最近公共祖先题意:给定一个二叉搜索树,找到该树中两个指定节点的最近公共祖先。解题思路:对于二叉搜索树,找两个点的最近公共祖先,这两个点所处的位置只有两种情况:情况一:两点在根节点的左右两侧情况二:两点在根节点的一侧(左侧或者右侧)递归......