求助 倍增LCA WA
查看原帖
求助 倍增LCA WA
158878
B1ade_楼主2021/9/29 12:43
#include<bits/stdc++.h>
using namespace std;
struct Edge
{
	int to,next;
}e[500001];
int n,m,s;
int dep[500001],head[500001],fa[500001][21],tot=0;
void add(int u,int v)
{
	e[++tot].to=v;
	e[tot].next=head[u];
	head[u]=tot;
}
void dfs(int p,int f)
{
	if (p==0) return;
	dep[p]=dep[f]+1;
	fa[p][0]=f;
	for (int i=1;(1<<i)<=dep[p];i++) fa[p][i]=fa[fa[p][i-1]][i-1];
	for (int i=head[p];i;i=e[i].next) if(e[i].to!=f) dfs(e[i].to,p);
}
int lca(int x,int y)
{
	if (dep[y]>dep[x]) swap(x,y);
	int t=20;
	while (dep[x]<dep[y])
	{
		if (dep[x]+(1<<t)<=dep[y])
			x=fa[x][t];
		t--;
	}
	if (x==y) return y;
	for (int i=20;i>=0;--i)
	{
		if (fa[x][i]!=fa[y][i])
		{
			x=fa[x][i];
			y=fa[y][i];
		}
	}
	return fa[x][0];
}
int main()
{
	cin>>n>>m>>s;
	for (int i=1;i<=n-1;++i)
	{
		int u,v;cin>>u>>v;
		add(u,v);
		add(v,u);
	}
	dfs(s,0);
	for (int i=1;i<=m;++i)
	{
		int x,y;cin>>x>>y;
		cout<<lca(x,y)<<endl;
	}
	return 0;
}

in:

5 5 4
3 1
2 4
5 1
1 4
2 4
3 2
3 5
1 2
4 5

out:

0
0
1
4
0
2021/9/29 12:43
加载中...