样例都没过,求助
查看原帖
样例都没过,求助
700478
ZHOUJIECHEN楼主2024/1/19 14:01
using namespace std;
int n,m,k,F[500005][22];
int head[500005],d[500005],cnt;
struct Edge
{
	int to,c,next;
}e[500005<<1];
void add(int u,int v,int w)
{
	e[++cnt].to=v;
	e[cnt].c=w;
	e[cnt].next=head[u];
	head[u]=cnt;
}
void dfs(int u)
{
	for(int i=head[u];i;i=e[i].next)
	{
		int v=e[i].to;
		if(v==F[u][0])
		{
			continue;
		}
		d[v]=d[u]+1;
		F[v][0]=u;
		dfs(v);
	}
}
int LCA_st_query(int x,int y)
{
	if(d[x]>d[y])
	{
		swap(x,y);
	}
	for(int i=k;i>=0;i--)
	{
		if(d[F[y][i]]>=d[x])
		{
			y=F[y][i];
		} 
	}
	if(x==y)
	{
		return x;
	}
	for(int i=k;i>=0;i--)
	{
		if(F[x][i]!=F[y][i])
		{
			x=F[x][i];
			y=F[y][i];
		}
	}
	return F[x][0];
}
int main()
{
	int x,y,T,lca;
	cin>>n;
		cin>>m>>T;
		k=log2(n);//log(n)/log(2)
		for(int i=1;i<=n;i++)//初始化 
		{
			head[i]=d[i]=0;
		}
		cnt=0;
		for(int i=1;i<n;i++)//输入一颗树的n-1边 
		{
			int x,y;
			cin>>x>>y;
			add(x,y,1);
			add(y,x,1);
		}
		d[1]=T;
		dfs(T);
		for(int i=1;i<=m;i++)
		{
			cin>>x>>y;
			cout<<LCA_st_query(x,y)<<endl;
		 } 
	return 0;
}```
2024/1/19 14:01
加载中...