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

最近公共祖先

时间:2023-11-27 22:15:53浏览次数:37  
标签:10 lg 祖先 ll dep fa 最近 公共 500000

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<ll> G[500000+10];
ll n,m,root;
ll f[500000+10][20],dep[500000+10],lg[500000+10];
void dfs(ll u,ll fa){
	f[u][0]=fa;
	dep[u]=dep[fa]+1;
	for(ll i=1;dep[u]-(1<<i)>0;i++)
		f[u][i]=f[f[u][i-1]][i-1];
	for(ll i=0;i<G[u].size();i++){
		ll v=G[u][i];
		if(v==fa)continue;
		dfs(v,u);
	}
}
ll lca(ll x,ll y){
	if(dep[x]<dep[y])swap(x,y);
	while(dep[x]>dep[y])x=f[x][lg[dep[x]-dep[y]]];
	if(x==y)return x;
	for(ll i=lg[dep[x]-1];i>=0;i--)
		if(f[x][i]!=f[y][i])
			x=f[x][i],y=f[y][i];
	return f[x][0];
}
int main(){
	cin >> n >> m >> root;
	for(ll i=1;i<=n;i++)lg[i]=lg[i-1]+(1<<(lg[i-1]+1)==i);
	for(ll i=1;i<=n-1;i++){
		ll u,v;
		cin >> u >> v;
		G[u].push_back(v);
		G[v].push_back(u);
	}
	dfs(root,0);
	for(ll i=1;i<=m;i++){
		ll x,y;
		cin >> x >> y;
		cout << lca(x,y) << endl;
	}
	return 0;
}

标签:10,lg,祖先,ll,dep,fa,最近,公共,500000
From: https://www.cnblogs.com/ningziang/p/17860588.html

相关文章

  • 最近公共祖先(LCA)
    最近公共祖先(LCA)概念在有根树中,两个点,会有共同的祖先,离他们两最近的公共祖先,即为LCA求法向上表记法O(n)从一个点开始,向上遍历,把走过的点标记一下再从另外一个点开始,向上遍历,如果走到的点已经被标记,即为LCA最坏的情况是条链,\(O(n)\)的复杂度倍增法O(logn)先预处理下各......
  • P1439 【模板】最长公共子序列
    前置知识:\(LIS\):即最长上升子序列(\(Longest\)\(Increasing\)\(Subsequence\))LuoguB3637最长上升子序列这是一个简单的动规板子题。给出一个由\(n(n\le5000)\)个不超过\(10^6\)的正整数(\(x_1,x_2,\cdots,x_n\))组成的序列。请输出这个序列的最长上升子......
  • (字符串)02-最长公共前缀
    1importjava.util.*;23publicclassSolution{4/**5*@paramstrsstring字符串一维数组6*@returnstring字符串7*/8publicStringlongestCommonPrefix(String[]strs){9//判空数组10if(strs.lengt......
  • 新建一个vite项目,使用ts语法的公共方法库的项目
    要创建一个使用TypeScript语法的公共方法库项目,可以按照以下步骤使用Vite构建工具来设置项目:安装Vite全局工具(如果已安装,请跳过此步骤):npminstall-gcreate-vite```创建新项目:create-vitemy-library--template=ts```上述命令将在名为`my-library`的文件夹中创建......
  • 上海公共交通卡乘车优惠指南 All In One
    上海公共交通卡乘车优惠指南AllInOne上海公交卡:地铁、公交、轮渡、磁悬浮、出租上海公共交通卡股份有限公司上海公共交通卡交通卡余额查询https://www.sptcc.com/index.html用卡范围公交:市内公交线路(旅游专线除外)地铁:轨道交通、磁悬浮列车出租:本市全......
  • Vue公共loading升级版(处理并发异步差时响应)
    公共loading是项目系统中很常见的场景,处理方式也不外乎三个步骤:1.通过全局状态管理定义状态值(vuex、pinia等)。2.在程序主入口监听状态值变化,从而展示/隐藏laoding动画。3.在请求和相应拦截器中变更状态值。第一二步骤处理大同小异,但在第三步中,网上很多博文分享的方法是:在请求......
  • 直播平台源码,隐藏app图标并不在最近运行中显示
    直播平台源码,隐藏app图标并不在最近运行中显示 <activity      android:name=".MainActivity"      android:excludeFromRecents="true"      android:noHistory="true">      <intent-filter>        <actio......
  • 「Temp」最近要干的事情
    博客部分小记:为了节省版面,小记将不在主页展示,依然会正常更新。(1/43)做题记录:将不再置顶。(Fixed)CF题解:将于近日补充。(1/7)目录:将于近日更新完整。(0/1)关于我:也许会更新一篇关于我自己的博文。(0/1)智慧:Trick部分需要被更新。(0/1)NOIP2023JL迷惑代码大赏:如果不忙的话会找时间......
  • [自问自答]如何瘦身已有仓库到只剩最近一条提交,像--depth=1那样
    问题:如何瘦身已有仓库到只剩最近一条提交,像--depth=1那样目的:降低磁盘占用回答:gitgc--prune=now清理未引用的对象,默认只保留一条提交进一步:拉取并还原为完整仓库的操作:gitgc--prune=now......
  • 【动态规划】最长公共子序列问题
    问题描述:字符串s1=BDCABC,字符串s2=ABCBDAB;求它们的最长公共子序列。定义dp[i][j]:s1的前i个字符串和s2前j个字符串的最长公共子序列长度。以下讨论三种情况:s1[i]==s2[j]s1的第i个字符等于s2的第j个字符dp[i][j]=dp[i-1][j-1]+1;......