萌新五个UKE求助
查看原帖
萌新五个UKE求助
96648
libear楼主2020/8/1 19:39

如题,记录,请问大佬们咋办啊?

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 500005
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
	while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
int d[N],fa[18][N],head[N],nxt[N],to[N];
int n,m,root,num=1;
void adde(int u,int v){
	to[num]=v;
	nxt[num]=head[u];
	head[u]=num;
	++num;
}
void dfs(int x){
	int i=0;
	for(i=head[x];i;i=nxt[i]){
		int v=to[i];
		if(v==fa[0][x])continue;
		d[v]=d[x]+1;
		fa[0][v]=x;
		dfs(v);
	}
}
void build(){
	for(int j=1;j<=17;j++)
		for(int i=1;i<=n;i++){
			fa[j][i]=fa[j-1][fa[j-1][i]];
		}
}
int solve(int u,int v){
	int i;
	if(d[u]<d[v])swap(u,v);
	int temp=d[u]-d[v];
	for(i=17;i>=0;i--)if(temp>=(1<<i))v=fa[i][u];		
	for(i=17;i>=0;i--){
		if(fa[i][v]!=fa[i][u])v=fa[i][v],u=fa[i][u];
	}
	return fa[0][v];
}
int main(){
	memset(head,-1,sizeof(head));
	n=read();
	m=read();
	root=read();
	for(int i=1;i<=n-1;i++){
		int u,v;
		u=read();
		v=read();
		adde(u,v);
		adde(v,u);
	}
	fa[0][root]=root;
	d[root]=1;
	dfs(root);
	build();
	int u,v;
	for(int i=1;i<=m;i++){
		u=read();
		v=read();
		int ans=solve(u,v);
		printf("%d\n",ans);
	}
	return 0;
}
2020/8/1 19:39
加载中...