栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

最近公共祖先(LCA)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

最近公共祖先(LCA)

倍增求lca

#include
using namespace std;
const int logn=19,maxn=5e5+5;
int d[maxn];
vectoru[maxn];
int n,m,x,y,f[maxn][logn],root;
void dfs(int now,int last)
{
	d[now]=d[last]+1;
	f[now][0]=last;
	for(int i=1;id[w])swap(u,w);
	for(int i=logn-1;i>=0;i--)
		if(d[u]<=d[f[w][i]])w=f[w][i];
	for(int i=logn-1;i>=0;i--){
		if(f[u][i]==f[w][i])continue;
		u=f[u][i];
		w=f[w][i];
	}
	if(u==w)return u;
	return f[u][0];
}	
int main()
{
	scanf("%d%d%d",&n,&m,&root);
	for(int i=1;i<=n-1;i++)
	{
		scanf("%d%d",&x,&y);
		u[x].push_back(y);
		u[y].push_back(x);
	}
	dfs(root,root);
	while(m--)
	{
		scanf("%d%d",&x,&y);
//		cout< 

Tarjan求lca

//Tarjan
#include
using namespace std;
const int maxn=5e5+5;
int n,m,x,y,f[maxn],ans[maxn],root;
vectoru[maxn],pos[maxn],qs[maxn];
bool vis[maxn];
int getf(int now)
{
	if(f[now]==now)return now;
	return f[now]=getf(f[now]);
}
void Tarjan(int now,int last)
{
	for(int i=0;i 

dfs序求lca

//dfs序 
#include
using namespace std;
const int maxn=5e5+5,logn=19;
int d[maxn],f[maxn][logn+2],T[maxn*2],t[maxn][3],len=0,n,m,x,y,root;
vectoru[maxn];
void dfs(int now,int last)
{
	d[now]=d[last]+1;
	f[now][0]=last;
	for(int i=1;id[v])swap(u,v);
	if(t[u][0]<=t[v][0]&&t[v][1]<=t[u][1])
		return u;
	for(int i=logn-1;i>=0;i--)
	{
		if(!(t[f[v][i]][0]<=t[u][0]&&t[u][1]<=t[f[v][i]][1]))
		v=f[v][i];
	}
	return f[v][0];
}
int main()
{
	scanf("%d%d%d",&n,&m,&root);
	for(int i=1;i 

题目:https://www.luogu.com.cn/problem/P3379

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/714981.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号