请求加强数据
查看原帖
请求加强数据
134066
Pethly_Cat楼主2021/4/10 13:57

RT

我的暴力直接过了,最快的点只跑了0.7s。。。

#include<cstdio>
#include<vector>
using namespace std;
int n,m,s,x,y,deep[500001],fa[500001];
vector<int>g[500001];
void dfs(int x,int y)
{
	deep[x]=y;
	for(int i=0;i<g[x].size();i++)
		if(deep[g[x][i]]==0)
			dfs(g[x][i],y+1);
}
void dfs2(int x)
{
	for(int i=0;i<g[x].size();i++)
		if(deep[g[x][i]]==deep[x]+1)
			fa[g[x][i]]=x,dfs2(g[x][i]);
}
int lca(int x,int y)
{
	int x1=x,y1=y;
	if(x==s||y==s)
		return s;
	for(int i=1;i<=max(0,deep[x1]-deep[y1]);i++)
		x=fa[x];
	for(int i=1;i<=max(0,deep[y1]-deep[x1]);i++)
		y=fa[y];
	while(x!=y)
		x=fa[x],y=fa[y];
	return x;
}
int main()
{
	scanf("%d%d%d",&n,&m,&s);
	for(int i=1;i<n;i++){
		scanf("%d%d",&x,&y);
		g[x].push_back(y);
		g[y].push_back(x);
	}
	dfs(s,1);
	dfs2(s);
	for(int i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		printf("%d\n",lca(x,y));
	}
	return 0;
}
2021/4/10 13:57
加载中...