样例过不了,dalao帮忙查查错
查看原帖
样例过不了,dalao帮忙查查错
327295
GalwayGirl楼主2022/7/4 12:13
#include<bits/stdc++.h>
using namespace std;
int n,m,s,u,v,c,head[510000],deep[510000],f[510000][21],x,y;
struct xzh
{
	int next,to;
}edge[510000];
void add(int u,int v)
{
	c++;
	edge[c].next=head[u];
	edge[c].to=v;
	head[u]=c;
}
void dfs(int now,int fa)
{
	for(int i=head[now];i;i=edge[i].next)
	{
		if(edge[i].to!=fa)
		{
			deep[edge[i].to]=deep[now]+1;
			f[edge[i].to][0]=now;
			dfs(edge[i].to,now);
		}
	}
}
void pre()
{
    for(int i=1;i<=21;i++)	
    for(int j=1;j<=n;j++)
    f[j][i]=f[f[j][i-1]][i-1];
}
int LCA(int x,int y)
{
	if(deep[x]<deep[y])swap(x,y);
	for(int i=21;i>=0;i--)if(deep[f[x][i]]>=deep[y])x=f[x][i];
	if(x==y)return x;
	for(int i=21;i>=0;i--)
	{
		if(f[x][i]!=f[y][i])
		{
			x=f[x][i];
			y=f[y][i];
		}
	}
	return f[x][0];
}
int main()
{
	scanf("%d%d%d",&n,&m,&s);
	for(int i=1;i<n;i++)
	{
		scanf("%d%d",&u,&v);
		add(u,v);
		add(v,u);
	}
	deep[s]=1;
	dfs(s,0);
	pre();
	while(m--)
	{
		scanf("%d%d",&x,&y);
		printf("%d\n",LCA(x,y));
	}
	return 0;
}
2022/7/4 12:13
加载中...