救命,本人17,写不对lca,还有救吗,求调,蟹蟹
查看原帖
救命,本人17,写不对lca,还有救吗,求调,蟹蟹
723431
sunyufei2005楼主2022/9/20 22:09
#include<bits/stdc++.h>
using namespace std;
int dep[10000000],fat[100000][22],lg[1000000];
struct Node{
	int to,net;
}e[1000000];
int cnt,head[600000];
void add(int u,int v)
{
	e[++cnt].to=v;
	e[cnt].net=head[u];
	head[u]=cnt;
}
void dfs(int u,int fa)
{
	fat[u][0]=fa;
	dep[u]=dep[fa]+1;
	for(int i=1;i<=lg[dep[u]];i++)
		fat[u][i]=fat[fat[u][i-1]][i-1];
	for(int i=head[u];i;i=e[i].net)
    {
		int b=e[i].to;
		if(b==fa)continue;
		dfs(b,u);
	}
}
int lca(int x,int y){
	if(dep[y]>dep[x])
	swap(x,y);
    while(dep[x]>dep[y])
    {
    	x=fat[x][lg[dep[x]-dep[y]]-1];
	}
	if(x==y)return x;
	for(int i=lg[x]-1;i>=0;i--)
		if(fat[x][i]!=fat[y][i])
		   x=fat[x][i],y=fat[y][i];
	return fat[x][0];
}
int main(){
	int n,m,s;
	scanf("%d%d%d",&n,&m,&s);
	for(int i=1;i<=n-1;i++)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		add(a,b);
		add(b,a);
	}
	for(int i=1;i<=n;i++)
	    lg[i]=lg[i-1]+(1<<lg[i-1]==i);
	dfs(s,0);
	for(int i=1;i<=m;i++)
	{
		int c,b;
		scanf("%d%d",&c,&b);
		printf("%d\n",lca(b,c));
		
	}
	return 0;
## }```c

```
2022/9/20 22:09
加载中...