【LCA】求最近公共祖先

2024-09-01 11:48
文章标签 公共 lca 最近 祖先

本文主要是介绍【LCA】求最近公共祖先,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

算法一:在线算法 倍增

POJ1330 模板题

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
#define maxn 10010int point[maxn*2],next[maxn*2],last[maxn],tot,dep[maxn];
int fa[maxn][20],T,n,root,a,b;
bool flag[maxn];void add(int x,int y){point[++tot]=y;next[tot]=last[x];last[x]=tot;}void clear(){memset(flag,true,sizeof(flag));tot=0;memset(last,0,sizeof(last));}void bfs(int root)
{queue<int>q;dep[root]=1;q.push(root);int i,j;while (!q.empty()){int tmp=q.front();q.pop();for (i=last[tmp];i;i=next[i]){int v=point[i];if (v==fa[tmp][0]) continue;dep[v]=dep[tmp]+1;fa[v][0]=tmp;q.push(v);}for (i=fa[tmp][0],j=0;i;i=fa[j][j++])fa[tmp][j+1]=fa[j][j];}}        int LCA(int u,int v)
{if (dep[u]<dep[v]) swap(u,v);int i;while (dep[u]>dep[v]){for (i=0;dep[fa[u][i]]>=dep[v];i++);u=fa[u][i-1];}while (u!=v){for (i=1;fa[u][i]!=fa[v][i];i++);u=fa[u][i-1];v=fa[v][i-1];}return u;
}int main()
{ scanf("%d",&T);while (T--){clear();scanf("%d",&n);for (int i=1;i<n;i++){scanf("%d%d",&a,&b);add(a,b);add(b,a);flag[b]=false;}for (int i=1;i<=n;i++)if (flag[i]){root=i;break;}bfs(root);int u,v;scanf("%d%d",&u,&v);printf("%d\n",LCA(u,v));}
}


这篇关于【LCA】求最近公共祖先的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1126853

相关文章

poj1330(LCA最近公共祖先)

题意:求最近公共祖先 思路:之前学习了树链剖分,然后我就用树链剖分的一小部分知识就可以解这个题目了,记录每个结点的fa和depth。然后查找时,每次将depth大的结点往上走直到x = y。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring>

最近心情有点复杂:论心态

一月一次的彷徨又占据了整个身心;彷徨源至不自信;而不自信则是感觉自己的价值没有很好的实现亦或者说是自己不认可自己的目前的生活和状态吧。 我始终相信一句话:任何人的生活形态完全是由自己决定的;外在的总归不能直达一个人的内心深处。所以少年 为了自己想要的生活 多坚持努力吧、不为别人只为自己心中的那一丝执着。 由此我看到了一个故事: 一个心情烦躁的人去拜访禅师。他问禅师:我这辈子就这么注定了吗?您

在二叉树中找到两个节点的最近公共祖先(基于Java)

如题  题解 public int lowestCommonAncestor(TreeNode root, int o1, int o2) {//记录遍历到的每个节点的父节点。Map<Integer, Integer> parent = new HashMap<>();Queue<TreeNode> queue = new LinkedList<>();parent.put(roo

【UVA】10066-The Twin Towers(最长公共子串问题)

赤裸裸的最长公共子串问题,没什么好说的,注意的是,每组数据后面都有一个空行。 13996019 10066 The Twin Towers Accepted C++ 0.015 2014-08-06 00:34:53 #include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using

算法图解(8~10贪心,动态规划,K最近邻算法)

贪心算法 在每一步都选择局部最优解,从而期望最终得到全局最优解。 贪心算法并不总能保证全局最优解,因此需要满足以下两个条件: 贪心选择性质:可以通过局部最优选择构造出全局最优解。最优子结构:问题的最优解包含其子问题的最优解。 实例:给定面额的硬币,用最少硬币凑出指定金额 int minCoins(vector<int>& coins, int amount) {int count = 0

救命!我已经彻底被最近的FLUX模型征服了

这是一期FLUX模型配套的罗拉模型推荐,这个大模型真的很香,尤其是对于人物的手部处理,推荐大家去尝试下,我已经爱上这个大模型了。 ① Flux魅影超模 https://www.liblib.art/modelinfo/15818662ba2e443d9b4f9a87c13fff55 关键词:照片上是一位优雅的年轻女子,一头棕色卷发,身穿米色上衣,戴着金耳环。她背对着相机,背景是浅色的。重点是

计算两个字符串的最大公共字符串的长度,字符不区分大小写

/*** */package testString;import java.util.Scanner;/***@author: Administrator*@date: 2016-12-28 下午01:08:30*/public class Main {public static void main(String[] args){Scanner sc=new Scanner(Syste

redis 实现单位时间内错误记录 时间到key值就被清除------最近脑子不好使觉得还是写个博客试试

直接在客户端操作的, 所以需要redis的简单命令  去对比JAVA客户端jedis的命令就行   添加---set     格式 set  key  value  EX time(秒)   如果这个time不添加的话 ,那默认就是 永久 获取--get    格式 get key  ---查看剩余时间    格式 TTL key ---实现key实现自增: inrc key

最近刚接触用到的一些linux命令(CentOS7的命令)二〇一八年十月三十日

linux  查看本地     ip  ip addr  查看本地系统     #cat /etc/issue 在CentOS下执行显示为: CentOS release 5.7 (Final) Kernel \r on an \m 或在Ubuntu下显示为: Ubuntu 11.04 \n \l 可以用来查看当前正在运行的 Ubuntu 的版本号。  查看系统内核     uname -a

Python高效计算两个字符串的最长公共子序列

Python高效计算两个字符串的最长公共子序列 在Python面试中,考官通常会关注候选人的编程能力、问题解决能力以及对Python语言特性的理解。计算两个字符串的最长公共子序列(Longest Common Subsequence, LCS)是一个经典的动态规划问题,广泛应用于文本比较、DNA序列分析等领域。本文将详细介绍如何编写一个函数,计算两个字符串的最长公共子序列,确保代码实用性强,条理