Least Common Ancestors

Tarjan 算法求LCA(Least Common Ancestors) Tarjan有几个著名的算法,其中之一就是求LCA(最近公共祖先)。   一个出现在有根树中间的常见问题是:在有根树T中询问一个距离根节点最远的结点xx(即深度最大的结点)使得xx同时为结点Tu、TvT_u、T_v的祖先,我们称xx为u、vu、v的最近公共祖先。这种对于公共祖先的询问我们称之为公共祖先问题,并且以LCA(T,u,v)LCA(T, u, v)表示询问TT中结点Tu、TvT_u、T_v 阅读详情
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
using namespace std;
struct node
{
	int f, s;
};
vector<node>imap[40005];
int deep[40005];
int dis[40005];
int fa[40005];
int ffa[40005];
bool vis[40005];
void dfs(int n,int s,int ff)
{
	vis[n] = true;
	for(int i=0;i<imap[n].size();i++)
	{
		if(vis[imap[n][i].f])		continue;
		deep[imap[n][i].f] = s;
		dis[imap[n][i].f] = dis[n]+imap[n][i].s;
		fa[imap[n][i].f] = n;
		ffa[imap[n][i].f] = ff;
		dfs(imap[n][i].f,s+1,ff);
	}
}

int lca(int x, int y)
{
	if(x==y)	return dis[x];
	if(deep[x]>=deep[y])	return lca(fa[x],y);
	else return lca(x,fa[y]);
}
int main()
{
	int t, n, m, c;
	int u, v, s, ans; 
	node cur;
	while(scanf("%d%d%d",&n,&m,&c)!=EOF)
	{
		memset(vis,false,sizeof(vis));
		memset(fa,0,sizeof(fa));
		memset(fa,false,sizeof(fa));
		memset(dis,0,sizeof(dis));
		memset(deep,false,sizeof(deep));	
		memset(imap,0,sizeof(imap));
		for(int i=0;i<m;i++)
		{
			scanf("%d%d%d",&u,&v,&s);
			cur.f = v;
			cur.s = s;
			imap[u].push_back(cur);
			cur.f = u;
			imap[v].push_back(cur);
		}
		for(int i=1;i<=n;i++)
		{
			if(vis[i])	continue;
			ffa[i] = i;
			dfs(i,1,i);
		}
		for(int i=0;i<c;i++)
		{
			scanf("%d%d",&u,&v);
			if(ffa[u]!=ffa[v])	printf("Not connected\n");
			else
			{
				ans = lca(u,v);
				printf("%d\n",dis[u]+dis[v]-2*ans);
			}		
		} 
		
	}
	return 0;
} 
来自HDU2847


docker安装fastdfs+nginx配置 docker安装fastdfs+nginx,实现图片或文件的上传与下载 阅读详情

相关推荐

【PVCodeNet】《Palm Vein Recognition Network Combining Transformer and CNN》

1]吴凯,沈文忠,贾丁丁,等.融合Transformer和CNN的手掌静脉识别网络[J].计算机工程与应用,2023,59(24):98-109.

bryant_meng 1280

最近公共祖先LCA问题

问题描述 求有根树的任意两个节点的最近公共祖先。 分析与解法 解答这个问题之前,咱们得先搞清楚到底什么是最近公共祖先。最近公共祖先简称LCA(Lowest Common Ancestor),所谓LCA,是当给定一个有根树T时,对于任意两个结点u、v,找到一个离根最远的结点x,使得x同时是u和v的祖先,x 便是u、v的最近公共祖先。(参见:http://en.wikipedia.o

Al_xin的专栏 2570

嘉立创EDA实战:从点亮第一盏灯到完成首块PCB

本文详细介绍了使用嘉立创EDA从点亮第一盏LED灯到完成首块PCB的全过程。通过实战案例分享,包括原理图绘制、PCB设计、DRC检查、覆铜操作等关键步骤,帮助电子设计爱好者快速掌握嘉立创EDA的使用技巧,并避免常见的设计错误。

weixin_30314793的博客 372

LCA总结

概述篇 LCA (Least Common Ancestors) ,即最近公共祖先,是指这样的一个问题:在一棵有根树中,找出某两个节点 u 和 v 最近的公共祖先。 LCA 可分为在线算法与离线算法 在线算法:指程序可以以序列化的方式一个一个处理输入,也就是说在一开始并不需要知道所有的输入。 离线算法:指一开始就需要知道问题的所有输入数据,而在解决一个问题后立即输出结果。 算法篇 ...

why932346109的博客 1894

基于51单片机的通讯聊天系统

通过编写51单片机通讯聊天程序,掌握51单片机的各个模块的知识点和运用C语言编写51单片机的能力。用51单片机与口袋开发板设计实现一个单片机与电脑串口助手实现通讯功能的程序。程序的主要功能如下: 1 OLED初始化显示Welcome to Bluetooth communication! 字符串。 2 程序开始时处于接收信息模式, 电脑串口助手发送信息时,将从初始化字符第一个开始显示,电脑串口助手发送信息后,蜂鸣器响铃2秒左右。 3 每次同时按下左右键时,可以轮流切换接收/发送信息模式 4 在发送信息模式时

m0_47419053的博客 3638

第4章 本地一键部署(新手首选)

本文介绍了OpenClaw的本地部署方法,特别适合新手用户。部署过程仅需执行一条命令,通过自动脚本完成安装和配置向导。安装完成后,用户可通过终端TUI或Web控制面板验证部署是否成功。文章还提供了常见问题的排查方法,包括端口占用、权限不足、APIKey无效和安装卡顿等情况。整个部署流程简单直观,无需手动修改配置文件,适合快速搭建使用。

eastyuxiao的专栏 193

最近公共祖先 python_『图论』LCA最近公共祖先(示例代码)

概述篇LCA(Least Common Ancestors),即最近公共祖先,是指这样的一个问题:在一棵有根树中,找出某两个节点 u 和 v 最近的公共祖先。LCA可分为在线算法与离线算法在线算法:指程序可以以序列化的方式一个一个处理输入,也就是说在一开始并不需要知道所有的输入。离线算法:指一开始就需要知道问题的所有输入数据,而在解决一个问题后立即输出结果。算法篇对于该问题,很容易想到的做法是从 ...

weixin_36114835的博客 517

CSP-J 入门级第一轮认证 2025 详细解析

2025年CSP-J入门级第一轮认证模拟赛提供10套免费试题,含选择题与解析。选择题涉及计算机科学基础,如32位无符号整数最大值计算(约42.9亿,选A)、C++位运算(255&254=254,选B)、递归函数分析(calc(5)=6,选B)、哈夫曼树构造(带权路径长度186,选B)等。其他题目涵盖图论(有向图边数等于入度/出度和,选B)、组合数学(120种选法,选C)、布尔逻辑(选项C不恒等)、模运算周期性(f[2025]=6,选D)、C++字符串特性(支持string+char,选B)及引用传参

lan_in的博客 2939

最近公共祖先LCA倍增算法

LCA定义 LCA(Least Common Ancestors):最近公共祖先即两个结点最近的公共祖先 由上图可以看到 5号结点和7号结点的LCA为3号结点,9号结点和7号结点的LCA为7号结点。 一般算法 首先可以将两个结点统一到相同深度,然后一起向上一步一步走,直到他们踩到相同点,则该点为他们的LCA 。 (树的深度:与根节点的距离则为树的深度,根节点的深度为0或者1,根据个人喜好设置) 复杂度分析 因为每次向上走一步,最多n个结点深度最大也就为n,所以最多也就走n步,复杂度为O(n)

weixin_46503238的博客 822

433MHz无线通信

基本概念 工作频率:433.92MHz 调制方式:ASK/OOK,FSK,GFSK 现有遥控与接收器方案中,多数使用ASK/OOK调试方式。ASK即“幅移键控”又称为“振幅键控”,也有称为“开关键控”(通断键控)的,所以又记作OOK(On-Off keyed)信号。ASK是一种相对简单的调制方式。幅移键控(ASK)相当于模拟信号中的调幅,不同的是与载频信号相乘的是二进制数码。幅移就是把频...

沧海孤叶的博客 5万+

Far planner 代码系列(33) 关于real_world_contour和contour_graph

我们知道far planner前部分的流程是这样子的: 对于特定的地图,如下: 我们要从surround_obs_cloud里抽取生成realworld_contour_,如下图所示: 在这时候,每个node的z坐标都是以机器人的高度定的。如图所示: 先去吃饭啦~待会回来在写 ...

博客 762

LCA详解

LCA问题(least Comment Ancestors,最近公共祖先问题),是指给定一棵有根树T,给出若干个查询LCA(u,v)(通常查询数量较大), 每次求树T中两个顶点u和v的最近公共祖先,即找到一个节点,同时是u和v的祖先,并且深度尽可能的大(尽可能远离树根). LCA问题的解法有很多,有一般解法,基于tarjan的解法,跳表解法以及RMQ和LCA互相转化的解法。下面我们依次

刘伟的博客 2万+

OpenCV自学记录(1)——(一拳超人)图像处理基础(图像获取、图像变化)

学习深度学习进行图像分类和目标检测时,要有一定的图像处理的基础。在学习深度学习之前,看了一本《图像处理技术基础》,现在也忘得差不多了,后悔当初没有整理记录下来。现在整理一下图像处理的常用方法,最后实现一个小项目——基于OpenCV的车牌号识别。 OpenCV自学记录(1)——图像处理基础(一)1、图像获取1.1获取图像数据1.2 获取摄像头图像数据2、图像变化2.1 移动(translation)...

qq_40784418的博客 1455

LCA (Least Common Ancestors)

LCA(Least Common Ancestors) 是解 决很多树上问题都必须应用到的东西。 对于点集 S = a1, a2, ..., an 的最近公共祖先 LCAS 为 S 的 所有公共祖先中深度最深的那个。 即最近公共祖先,是指在有根树中,找出某两个结点u和v最近的公共祖先。 对于有根树T的两个结点u、v,最近公共祖先 表示一个结点x,满足x是u、v的祖先且x的深...

weixin_30488085的博客 215

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

最近公共祖先(Least Common Ancestors)

题意:给定一棵有根树T,给出若干个查询lca(u, v)(通常查询数量较大),每次求树T中两个顶点u和v的最近公共祖先,即找一个节点,同时是u和v的祖先,并且深度尽可能大(尽可能远离树根)。通常有以下几种算法: 在线算法,每次读入一个查询,处理这个查询,给出答案。 离线算法,一次性读入所有查询,统一进行处理,给出所有答案。 在线:倍增(基于二分搜索):基本思想就是让u和v同时走到同一高度,然后再一起

Tuesday 565

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

LCA(Least Common Ancestors)

#include<iostream> #include<math.h> #include<string.h> #define MAXN 10005 using namespace std; int head[MAXN*2],cnt; struct edge { int to; int next; } e[MAXN*2];//链式向前星的边 int N,d[MAXN],f[MAXN][30],n; //N是最远跳2的多少次,d[]是每个点的深度,f[i][j]是i点的2

清风 424

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

最近公共祖先(least common ancestors,LCA)

摘要:   本文主要介绍了解决LCA(最近公共祖先问题)的两种算法,分别是离线Tarjan算法和在线算法,着重展示了在具体题目中的应用细节。   最近公共祖先是指对于一棵有根树T的两个结点u和v,它们的LCA(T,u,v)表示一个结点x,满足x是u和v的公共祖先且x深度尽可能的大(也即最近)。   求最近公共祖先有两种方法:一种是离线求解算法,也就是将询问全部存起来,处理完之后...

aisebu7819的博客 204

LCA(Least Common Ancestors,最近公共祖先)问题

问题描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” –所有节点的值都是唯一的。 –p、q 为不同节点且均存在于给定的二叉树中。 解法(只针对一般情况) 这里只针对算法进行解析 首先要考虑特殊情况: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNod

yingLGG的博客 432

最近公共祖先(least common ancestors algorithm)

lca问题是最近公共祖先问题,一般是针对树结构的。 现在有两种方法来解决这样的问题 1. On-line algorithm 用比较长的时间做预处理。然后对每次询问进行回答。 思路:对于一棵树中的两个节点,假设是u和v。我们要找到他们的最近的一个祖先,那么我们可以这样找,首先判断他们是不是一辈儿的人,也就是说他们的深度是不是一样的,如果一个较深(u),一个较浅(v)。我们可以不

晚晴小筑 1215

LCA (Least common ancestors)最近公共祖先

contents:写在前面什么是最近公共祖先?暴力求解倍增代码实现补充 写在前面 链接: 参考bili视频. 什么是最近公共祖先? 如图,节点3和4的LCA是1 节点3和2的LCA是0 暴力求解 比如求3和9的LCA 1、深度不同,我们先将比较深的节点转到同一深度 2、然后一起往上跳,直到相遇 特例: 求1和10的LCA我们发现转到同一高度时就已经是ans了 但是这样一层一层的跳太慢了 有没有办法加速这个过程呢 这就需要用到倍增了 倍增 当你需要到达7以外的节点的时候 你可以一步一步的移动(暴力)

MoRan0_0的博客 289

LCA最近公共祖先(least common ancestors)

#include"stdio.h" #include"string.h" #include"iostream" #include"queue" #define M 111111 using namespace std; struct st {     int u,v,next,w; }edge[M*2]; int rank[M],head[M],t,pre[M],use[M],

PSQ的专栏 916

最近公共祖先(Least Common Ancestors,LCA)问题详解

问题描述与分析求有根树的任意两个节点的最近公共祖先。 解答这个问题之前,咱们得先搞清楚到底什么是最近公共祖先。最近公共祖先简称LCA(Lowest Common Ancestor),所谓LCA,是当给定一个有根树T时,对于任意两个结点u、v,找到一个离根最远的结点x,使得x同时是u和v的祖先,x 便是u、v的最近公共祖先。(参见:http://en.wikipedia.org/wiki/Lowes...

weixin_34247032的博客 364

LCA(least common ancestors)最近公共祖先

http://blog.youkuaiyun.com/hnust_xiehonghao/article/details/9109295对于有根树T的两个节点u、v,最近公共祖先LCA(u,v)表示一个节点x,满足x是u,v的祖先,且x的深度尽可能大 如果把树看成图,就是求到u,v的最短距离时间复杂度为O(n+q),n为树的节点数,q为询问次数 离线算法Trajan算法基于深度优先搜索,对于新搜索到的一个节点

fsdcyr 686
上一篇: Codeforce 438D-The Child and Sequence
下一篇: cf 61E. Enemy is weak 树状数组求逆序数(WA)
梁千仞
博客等级 码龄15年 12粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值