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

最近公共祖先

时间:2023-06-30 09:44:24浏览次数:23  
标签:dep head 祖先 cin tot int 最近 公共 bz

#include <bits/stdc++.h>
using namespace std;
const int K = 20;
const int N = 5E5 + 5 , M = N * 2;

int head[N],ver[M],nxt[M],tot; 
int dep[N],bz[N][K];

void add(int x,int y) {
	ver[++tot] = y , nxt[tot] = head[x] , head[x] = tot;
}
void bfs(int x) {
	
	queue<int> q;
	q.push(x);
	dep[x] = 1; //注意这里 dep[x] = 1 , 防止 bfs 中 if(!dep[v]) 判断 , dep[root] = 0 时会重新入队
	
	
	while(q.size()) {
		int u = q.front(); q.pop();
		for(int i = head[u] ; i ; i = nxt[i]) {
			int v = ver[i];
			if(!dep[v]) {
				dep[v] = dep[u] + 1;
				bz[v][0] = u;
				for(int j = 1 ; j < K ; ++j)
					bz[v][j] = bz[bz[v][j - 1]][j - 1];
				q.push(v);
			}
		}
	}
}
int lca(int x,int y)
{
	if(dep[x] < dep[y]) swap(x , y);
	
	for(int i = K - 1 ; i >= 0 ; --i) {
		if(dep[x] - dep[y] >= (1 << i)) // 同时注意写法 if(dep[bz[x][i]] >= dep[y]) , 这里 dep[root] = 0 时 , 会出错
			x = bz[x][i];
	}
	
	for(int i = K - 1 ; i >= 0 ; --i) {
		if(bz[x][i] != bz[y][i])
			x = bz[x][i] , y = bz[y][i];
	}
	
	if(x != y) {
		x = bz[x][0] , y = bz[y][0];
	}
	
	return x;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0) ; cout.tie(0);
	
	int n,m,s;
	cin >> n >> m >> s;
	
	for(int i = 0 ; i < n - 1 ; ++i) {
		int x,y;
		cin >> x >> y;
		add(x , y) , add(y , x);
	}
	
	bfs(s);	
	
	while (m--) {
		int x,y;
		cin >> x >> y;
		cout << lca(x , y) << '\n';
	}
	return 0;
}

标签:dep,head,祖先,cin,tot,int,最近,公共,bz
From: https://www.cnblogs.com/xqy2003/p/17515781.html

相关文章

  • 移动开发者,我知道最近你们过得都不太好
    前言:不知道从何时开始,互联网行业每年都会迎来一波裁员,从向社会输送人才、到毕业通知,我们也见证了众多奇葩的说法也不知道从什么时候开始,移动开发的处境仿佛比大环境更加恶劣,每年你都能看到其他类别的开发者唱衰Android,以及天天有移动开发者在问Android什么时候会凉,该如何转行……......
  • app是私有内存和公共内存
    Android系统中每个APP占内存会有私有和公共的两部分:ShareDirty、PrivateDirty。“PrivateDirty”内存是其最重要的部分,因为只被自己的进程使用。它只在内存中存储,因此不能做分页存储到外存(Android不支持swap)。所有分配的Dalvik堆和本地堆都是“privatedirty”内存;Dalvik堆和本......
  • "快速访问"(Quick Access)是 Windows 操作系统中一个常用的功能,它允许用户快速访问最近
    "快速访问"(QuickAccess)是Windows操作系统中一个常用的功能,它允许用户快速访问最近使用的文件和常用的文件夹。它在资源管理器中的左侧导航窗格中显示,并提供了便捷的方式来查找和打开文件。在Windows10中,"快速访问"默认显示用户最近访问的文件和常用的文件夹。它会根据用户......
  • 最近项(Recent Items)功能在不同版本的 Windows 操作系统中可能会有一些差异和功能更新
    最近项(RecentItems)功能在不同版本的Windows操作系统中可能会有一些差异和功能更新。以下是几个常见的Windows版本的最近项功能的更新情况:WindowsXP:在WindowsXP中,最近项功能也被称为"最近文档"(MyRecentDocuments)。你可以从开始菜单中直接访问最近文档列表,它位于"文......
  • 各省级行政区公共数据开放平台网址
    北京https://data.beijing.gov.cn/北京市政务数据资源网,开放了103个部门的10266个政务数据集。天津 https://data.tj.gov.cn/ 天津市信息资源统一开放平台,开放了52个市级部门的1095个政务数据集,提供了508个数据接口。上海 https://data.sh.gov.cn/ 上海市公共数据开放平台......
  • MyBatis-Plus公共字段填充
    在实体类的属性上加入@TableField注解,指定自动填充的策略@TableField(fill=FieldFill.INSERT)//插入时填充字段privateLocalDateTimecreateTime;@TableField(fill=FieldFill.INSERT_UPDATE)//插入和更新时填充字段privateLocalDateTimeupdateTim......
  • 诶,你为啥最近和 POLARDB 较劲, 要不咱杠杠
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。最近一直在学习POALRDB以及POLARDB周边的东西,这就引起私信我的一个问题,问:你不是弄POSTGRESQL,MYSQL,MONGODB的吗,怎么又搅和......
  • 最近公共祖先-算法学习
    问题提出如何计算树上任意两点x和y的最近公共祖先呢?通俗地理解-假设在一棵二叉树中,有两个节点和那么该如何求这两个节点的最近公共祖先节点如下图,节点和节点的最近公共祖先节点是思路解析假设一个节点的深度为,这可以通过一次DFS预处理出来。那么这里如何进行预处理呢?单......
  • [Leetcode] 0014. 最长公共前缀
    14.最长公共前缀点击上方,跳转至Leetcode题目描述编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。 示例1:输入:strs=["flower","flow","flight"]输出:"fl"示例2:输入:strs=["dog","racecar","car"]输出......
  • 2023年Android社招面试题集锦(最近准备面试的可以看看~)
    最近有不少小伙伴咨询社招,春招的事情,小编这里收纳了一篇《如何找到一份实习工作》的内容,作者是阿木(一家知名的互联网大厂),这篇内容算是他对自己找工作经历的一个总结吧,对于社招、在校生,尤其是想找实习的小伙伴会很有帮助,同时还有最新面试题汇总。顺带给大家同步一个关键的信息,暑期......