POJ-1330 LCA的两种写法

LCA四种写法其一:倍增 文章目录众所周知一、倍增区间倍增二、LCA2.读入数据总结 众所周知 LCA有四种写法 一、倍增 fa[n][logn],fa[i][j]表示i节点的第2^j个父亲。 显然:fa[i][j]=fa[ fa[i][j-1] ][j-1] 即i的第2j个父亲是i的第2(j-1)个父亲的第2(j-1)个父亲。 于是,求i的第k个父亲的复杂度O(k)—>O(logk) 求i的第k个父亲: 1. for(int j=0; j<=log2(k); j++) 2. if((1<<j)&a. 阅读详情

方法一:RMQ

对树做一次dfs序,记录每个节点在dfs序中的初始位置以及每个节点在树中的深度,查询两节点初始位置所形成的区间中深度最小的节点即为两者的最近公共祖先,查询部分采用RMQ即可。

import java.util.*;
public class Main {
	static int T,n,ee,a,b,c,kk,rt,ans;
	static int[] dd=new int[10005];
	static int[] vis=new int[10005];
	static int[] pos=new int[10005];
	static int[] dep=new int[10005];
	static int[] dfs=new int[20005];
	static int[] head=new int[10005];
	static int[] edge=new int[20005];
	static int[] next=new int[20005];
	static int[][] min=new int[20005][15];
	static void add(int a,int b)
	{
		edge[ee]=b;next[ee]=head[a];
		head[a]=ee++;
	}
	static void dfs(int x,int d)
	{
		dep[x]=d;vis[x]=1;
		dfs[++kk]=x;pos[x]=kk;
		for(int i=head[x];i!=-1;i=next[i])
		{
			int v=edge[i];
			if(vis[v]==1) continue;
			dfs(v,d+1);
			dfs[++kk]=x;
		}
	}
	static int rmq(int l,int r)
	{
		c=0;
		while((1<<(c+1))<=r-l+1) c++;
		int res=0;
		if(dep[min[l][c]]<dep[min[r-(1<<c)+1][c]])
			res=min[l][c];
		else res=min[r-(1<<c)+1][c];
		return res;
	}

	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		T=in.nextInt();
		while(T-->0)
		{
			n=in.nextInt();
			Arrays.fill(head,-1);ee=0;
			Arrays.fill(dd,0);
			for(int i=1;i<n;i++)
			{
				a=in.nextInt();b=in.nextInt();
				add(a,b);dd[b]++;
			}
			Arrays.fill(vis,0);kk=0;
			for(int i=1;i<=n;i++)
				if(dd[i]==0) { rt=i;break;}
			dfs(rt,1);
			for(int j=0;j<=14;j++)
			for(int i=1;i<=kk;i++)
			{
				if(i+(1<<j)-1>kk) continue;
				if(j==0) min[i][j]=dfs[i];
				else
				{
					if(dep[min[i][j-1]]<dep[min[i+(1<<(j-1))][j-1]])
						min[i][j]=min[i][j-1];
					else min[i][j]=min[i+(1<<(j-1))][j-1];
				}
			}
			a=in.nextInt();b=in.nextInt();
			if(pos[a]>pos[b]) { c=a;a=b;b=c;}
			ans=rmq(pos[a],pos[b]);
			System.out.println(ans);
		}
	}
}


方法二:倍增法

import java.util.*;
public class Main {
	static int T,n,a,b,c,ee,rt,ans;
	static int[] dd=new int[10005];
	static int[] dep=new int[10005];
	static int[] head=new int[10005];
	static int[] edge=new int[20005];
	static int[] next=new int[20005];
	static int[][] ff=new int[10005][15];
	static void add(int a,int b)
	{
		edge[ee]=b;next[ee]=head[a];
		head[a]=ee++;
	}
	static void dfs(int x,int fa,int d)
	{
		ff[x][0]=fa;dep[x]=d;
		for(int i=1;(1<<i)<d;i++)
			ff[x][i]=ff[ff[x][i-1]][i-1];
		for(int i=head[x];i!=-1;i=next[i])
			dfs(edge[i],x,d+1);
	}
	static int LCA(int u,int v)
	{
		if(dep[u]<dep[v]) { c=v;v=u;u=c;}
		for(int i=14;i>=0;i--)
			if(dep[u]-(1<<i)>=dep[v]) u=ff[u][i];
		for(int i=14;i>=0;i--)
		{
			if(dep[u]<=(1<<i)||ff[u][i]==ff[v][i]) continue;
			u=ff[u][i];v=ff[v][i];
		}
		int res=(u==v)?u:ff[u][0];
		return res;
	}

	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		T=in.nextInt();
		while(T-->0)
		{
			n=in.nextInt();
			Arrays.fill(head,-1);ee=0;
			Arrays.fill(dd,0);
			for(int i=1;i<n;i++)
			{
				a=in.nextInt();b=in.nextInt();
				add(a,b);dd[b]++;
			}
			for(int i=1;i<=n;i++)
				if(dd[i]==0) { rt=i;break;}
			dfs(rt,-1,1);
			a=in.nextInt();b=in.nextInt();
			ans=LCA(a,b);
			System.out.println(ans);
		}
	}
}



使用PyTorch设计卷积神经网络(CNN)来处理遥感图像Indian Pines数据集 阅读详情

相关推荐

超详细的YOLOv8安装与测试指南:让计算机视觉任务变得简单

python3+、Anaconda3或Miniconda3 Ultralytics提供了多种安装方法,包括pip、conda和Docker。通过pip包安装最新稳定版的YOLOv8,或者克隆Ultralytics GitHub仓库以获取最新版本。Docker可用于在隔离容器中执行包,避免本地安装。 最简单直接的方式就是直接使用pip方法直接安装。 也可以直接从GitHub仓库安装包。如果你想要最新的开发版本,这可能会很有用。确保你的系统上安装了Git命令行工具

CDBmax的博客 1万+

P3379 【模板】最近公共祖先(LCA)的两种写法

回溯完它所有的子节点的时候(此时x标记为1)枚举所有要和x找公共祖先的点,判断这个点是否标记为2,如果为2,找到这个点所在集合的代表点,这个点即为x和y的公共祖先。做完这一切准备回溯x节点时别忘了把x节点标记成2。利用递推思想,f[y][j]=f[f[y][j-1]][j-1],即y往上走2^j的节点就是y往上走2^(j-1)到达的节点往上走2^(j-1)的节点,因为j从0-log(n)/log(2)的顺序循环,y的2^(j-1)的祖先上一步已经找到,这里可以理解为初始化f[y][0]=x的递推。

mahuatengdediedi的博客 293

INMP441麦克风避坑指南:为什么你的I2S录音总有杂音?(附示波器调试技巧)

本文针对INMP441麦克风与ESP32等MCU通过I2S接口连接时常见的录音杂音问题,提供了一套系统的硬件调试指南。文章深入剖析了电源纹波、信号完整性、接地环路及时钟抖动四大噪声根源,并详细讲解了如何使用示波器进行逐层排查,给出了增加LC滤波、串联阻尼电阻、优化布局布线等切实可行的解决方案,帮助开发者从根本上提升音频质量。

k0l1m2n3o的博客 1023

POJ1330 Nearest Common Ancestors (JAVA)

经典LCA操作。。 贴AC代码 import java.lang.reflect.Array; import java.util.*; public class POJ1330 { // 并查集部分 static int[] p; static int find(int u){ if(p[u]!=u){ ...

ditumao9111的博客 257

小白快速上手 labelme:新手图像标注详解教程

本教程旨在帮助初次接触 labelme 的用户快速上手该软件,掌握基本操作与标注流程,为语义分割数据集做准备。

小白一枚~ 2万+

SolidWorks + AI:利用 DeepSeek AI 自动生成 VBA Macro 宏,实现智能化建模!

本教程介绍如何将集成到插件,实现的自动化操作。通过 DeepSeek AI,您可以快速生成高效的,提升!💡。

SolidWorksAPI的专栏 1万+

poj-1330(暴力写的lca)

传送门 一看就是lca的板子题 然而 (写这个的时候我忘了怎么写lca) 于是我就试着写暴力了 本以为会tle结果e了一次后居然a掉了 开心到起飞.嘿嘿嘿 但还是格式输出错误了一次而且在ce之前也de了一会儿(sdqxt太蒻了) sd错误如下: 1. 边的编号和点的编号弄混了 2.一开始直接写成i <= deep[x] – deep[y]  于是...

weixin_30420305的博客 146

别再只测电压了!用STM32G474的ADC玩点花的:过采样提升精度与多通道扫描实战

本文深入探讨了STM32G474系列单片机的ADC高级应用,包括硬件过采样技术实现16位精度和多通道扫描结合DMA的自动数据采集方案。通过详细的配置步骤和实战案例,帮助开发者突破传统电压测量局限,提升信号采集精度和系统效率,适用于工业监控、医疗设备等高精度应用场景。

weixin_42647395的博客 240

POJ1330&&LCA最近公共祖先模板

在这我用的是tarjan搞的:tarjan的话需要知道树的根节点,这题没说,但是可以根据入度等于0,判断根节点;tarjan的主要思想是DFS和并查集; tarjan:有待补充 #include #include #include #include #include #include #include #include #include #include using na

951

Duilib的简单使用(五、DuiDesigner/DuiEditor的下载编译)

一、前言 在Duilib的简单使用(一、duilib demo)中我们介绍了利用duilib简单的构造一个项目 在Duilib的简单使用(二、xml实现界面与业务分离)中我们介绍了XML在duilib中的使用 在Duilib的简单使用(三、界面逻辑交互)中我们已经知道如何简单的进行界面的交互 在Duilib的简单使用(四、换肤)中,我们提了一下Duilib强大的一键换肤功能。 通过之前的说明,我们知道duilib是通过xml来分离界面和业务逻辑的,但是xml如果不能预览,那每次敲一个再运行一下看看效果,这不

LyRics1996的博客 2890

SAP Word 模板与 ABAP XML 数据流合并机制深度解析

Office Open XML 标准把一个.docx拆分成多个部件(document.xml、customXml\item1.xml 等),天然支持命名空间与 XPath;Word 在渲染时,会扫描<w:sdt>(结构化文档标签)与来确定绑定关系;在 ABAP 端,通过简单字符串替换与 XSLT 变换即可完成数据灌入,无需 COM Automation,安全且易于调试。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 373

【lca】lca的tarjan写法 poj1330

今天看了一下午的lca的tarjan写法,发现果真还是不能全部理解,不过还是有大部分能够理解,就将自己的思路写在这里备忘吧。。 tarjan算法是基于并查集与dfs的一种离线算法 tarjan算法的步骤是(当dfs到节点u时): 1 在并查集中建立仅有u的集合,设置该集合的祖先为u,就是普通的并查集,fa[i] = i; 1 对u的每个孩子v:    1.1 tarjan之    1.

Fighting!! 565

UNet 改进(27):结合SCSE注意力机制的UNet网络实现

本文介绍了一种结合SCSE注意力机制的改进UNet网络架构。该网络在保持UNet经典编码器-解码器结构基础上,通过在每层添加SCSEBlock模块,融合了通道注意力和空间注意力机制。通道注意力通过全局池化和1×1卷积生成通道权重,空间注意力则产生空间权重图,二者相加增强关键特征响应。该设计具有以下优势:1)保持原始UNet的多尺度特征提取能力;2)通过注意力机制提升对重要区域的关注度;3)计算效率高,仅增加少量参数。测试显示网络能保持输入输出分辨率不变,适用于医学图像分割等像素级预测任务。完整代码实现了5层

2401_82355416的博客 415

POJ1330 (LCA入门题)

http://poj.org/problem?id=1330 题意:单纯求LCA板子 题解:单纯跑LCA 注意:不知道根节点时,用并差集把所有点连起来,最后直接 root=find(1)即可(都懂吧) 初始化并差集的fat数组和vector数组时一定要注意你的范围(点的多少) #include<cstdio> #include<cstring&...

gml1999的博客 343

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

POJ 1330 Nearest Common Ancestors 倍增算法的LCA

POJ 1330 Nearest Common Ancestors 题意:最近公共祖先的裸题 思路:LCA和ST我们已经很熟悉了,但是这里的f[i][j]却有相似却又不同的含义。f[i][j]表示i节点的第2j个父亲是多少      这个代码不是我的,转自 邝斌博客 1 /* *********************************************** 2

Macan - 生活点滴 533

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

LCA之倍增法(例题:POJ1330)

LCA之倍增法 最近公共祖先简称 LCA(Lowest Common Ancestor)。两个节点的最近公共祖先,就是这两个点的公共祖先里面,离根最远的那个。 除去朴素算法,LCA还可以用倍增法来求,倍增法在算法中的应用还是比较多的,可以用来求ST表(区间最大最小值),还可以用来求LCA。其中求LCA的方法如下: 整体流程 预处理 用BFS或者DFS处理 deg[i]:结点i的深度 fa[i...

Radium_1209 421

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

POJ 1330 Nearest Common Ancestors LCA

POJ 1330 可以说是经典的LCA求最近公共祖先的模板题,先入门感受下LCA,还有poj运行STL会WA,所以建议使用静态连接的邻接表做,还有codeforces的#include头文件也不支持。 代码如下: #include #include #include #include using namespace std; typedef long long LL; #define INF

Akahieveman的博客 571

POJ 1330:Nearest Common Ancestors ← 暴力法(同步前进法‌)+ LCA

“同步前进法‌”是一种求 LCA 的暴力法,即将深度较深的节点提升至与另一节点相同深度后,两节点同步向上移动,直到相遇的节点即为 LCA‌。例如,若节点 x 深度大于 y 的深度,则先将 x 提升至与 y 同深度,再共同向上搜索‌。

hnjzsyjyj的专栏 1139

POJ - 1330 Nearest Common Ancestors(LCA tarjan)

POJ1330 题目 思路: LCA基础题,就一个询问。这里用的tarjan算法 推荐博客:大神博客 代码: #include #include #include using namespace std; const int maxn = 1e4+10; int f[maxn], h[maxn], anc[maxn], vis[maxn], isRoot[maxn]; int

shinimashzi 233

POJ 1330 最近公共祖先LCA(Tarjan离线做法)

题目链接:http://poj.org/problem?id=1330 题目大意十分明了简单,就是给定一棵树,求某两个子节点的最近公共祖先,如果尚不清楚LCA的同学,可以左转百度等进行学习。 稍微需要注意的是,建树顺序需要按照题目给定的顺序进行,也就是说根被设定成第一个给出的结点,如样例2。 此题网上题解颇多,但是多是使用的邻接表存图,于是我这里采用了边表,不过实质上Tarjan的部分思想都

纳兰 660

poj1330-LCA

题目链接:http://poj.org/problem?id=1330 DescriptionA rooted tree is a well-known data structure in computer science and engineering. An example is shown below: In the figure, each node is...

测试 333

【POJ 1330】 Nearest Common Ancestors(LCA)

【POJ 1330】 Nearest Common Ancestors(LCA) Nearest Common Ancestors Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22677   Accepted: 11836 Descr

ACMer' 1846

POJ1330 Nearest Common Ancestors

POJ1330 筱柒Littleseven QQ:3534947775 题目链接 #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int MAXN = 10010; int tot...

筱柒LittleSeven 196

POJ 1330 Nearest Common Ancestors【tarjan】【简单LCA】【模板题】【并查集】

题目链接:http://poj.org/problem?id=1330 题目大意:给出n个父子关系,不会出现回路,求最原始祖先(根节点)。 照大佬的板子自己手码了一遍,还挺长,,, AC代码: #include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #include&...

weixin_43499182的博客 208

LCA(倍增法)

LCA(最近公共祖先):给你一棵树,然后给你两个点,让你找到这两个点的最近公共祖先,俩个点的公共祖先有很多,但是其中距离两个点的距离之和最小的那个祖先就是最近公共祖先。 刚学了树上倍增法求LCA 最近做了几个板子题,记录一下这种算法的基本,,,过程吧。 fa数组:倍增关键数组,fa[i][j]表示以i开始找2j步的祖先,例如fa[i][0]就表示i的20的祖先也就是i的父结点。 de数组:当前这个...

HANGANG的博客 1434

POJ1330(LCA裸题,倍增法)

题目链接 题意:求LCA(一棵树2个节点的最近祖先节点) 思路:倍增法求LCA #include <cstring> #include <cstdio> #include <cstdlib> #include <algorithm> #include <cmath> #include <vector> using namesp...

Ray.C.L的博客 428
上一篇: 二分图最大权匹配--KM算法模板
下一篇: HDU-4729 树链剖分+主席树
AC_Machine
博客等级 码龄11年 1粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值