树剖样例过不了求调教
查看原帖
树剖样例过不了求调教
754502
_AyachiNene楼主2023/5/4 15:13
#include<bits/stdc++.h>
using namespace std;
struct node
{
	int to,nxt;
}e[114514*5];
int head[114514*5],cnt1;
void add(int x,int y)
{
	e[++cnt1].to=y;
	e[cnt1].nxt=head[x];
	head[x]=cnt1;
}
int dep[114514*5],f[114514*5],size[114514*5],son[114514*5];
int top[114514*5],id[114514*5],cnt;
void dfs1(int u,int fa)
{
	size[u]=1;
	for(int i=head[u];i;i=e[i].nxt)
	{
		int v=e[i].to;
		if(v!=fa)
		{
			dep[v]=dep[u]+1;
			f[v]=u;
			dfs1(v,u);
			size[u]+=size[v];
			if(size[v]>size[son[u]])
				son[u]=v;
		}
	}
}
void dfs2(int u,int t)
{
	id[u]=++cnt;
	top[u]=t;
	if(son[u])
		dfs2(son[u],t);
	for(int i=head[u];i;i=e[i].nxt)
	{
		int v=e[i].to;
		if(v!=f[u]&&v!=son[u])
			dfs2(v,v);
	}
}
int lca(int x,int y)
{
	while(top[x]!=top[y])
	{
		if(dep[top[x]]<dep[top[y]])
			swap(x,y);
		x=f[top[x]];
	}
	return dep[x]<dep[y]?x:y;
}
int n,m,s;
int main()
{
	cin>>n>>m>>s;
	for(int i=1;i<n;i++)
	{
		int x,y;
		cin>>x>>y;
		add(x,y);
		add(y,x);
	}
	while(m--)
	{
		int x,y;
		cin>>x>>y;
		cout<<lca(x,y)<<endl;	
	}
}
2023/5/4 15:13
加载中...