样例过,10分,倍增LCA求救
查看原帖
样例过,10分,倍增LCA求救
148812
cxm1024楼主2021/8/16 09:59

RT

#include<iostream>
#include<cstring>
using namespace std;
int n,m,s;
int fa[500010][22],deep[500010];
int head[500010],cnt=-1;
struct edge
{
	int to,next;
}e[1000010];
void addedge(int u,int v)
{
	cnt++;
	e[cnt].next=head[u],e[cnt].to=v;
	head[u]=cnt;
}
void dfs(int now,int father,int deepnow)
{
	fa[now][0]=father,deep[now]=deepnow;
	for(int i=1;i<=21;i++)
		fa[now][i]=fa[fa[now][i-1]][i-1];
	for(int i=head[now];~i;i=e[i].next)
		if(e[i].to!=father)
			dfs(e[i].to,now,deepnow+1);
}
int lca(int x,int y)
{
	if(deep[x]<deep[y])
		swap(x,y);
	if(deep[x]!=deep[y])
	{
		int deepx=deep[x],deepy=deep[y];
		for(int i=21;i>=0;i--)
			if(deepx-(1<<i)<=deepy)
				x=fa[x][i],deepx-=(1<<i);
	}
	if(x==y)
		return x;
	for(int i=21;i>=0;i--)
		if(fa[x][i]!=fa[y][i])
			x=fa[x][i],y=fa[y][i];
	return fa[x][0];
}
int main()
{
	memset(head,-1,sizeof(head));
	cin>>n>>m>>s;
	for(int i=1;i<n;i++)
	{
		int x,y;
		cin>>x>>y;
		addedge(x,y);
		addedge(y,x);
	}
	dfs(s,s,0);
	while(m--)
	{
		int x,y;
		cin>>x>>y;
		cout<<lca(x,y)<<endl;
	}
	return 0;
}
2021/8/16 09:59
加载中...