100分求助!!!
查看原帖
100分求助!!!
465054
HappyMar10楼主2023/8/29 10:14
#include<bits/stdc++.h>
using namespace std;
struct tree {
	int to,next;
} es[1500000];
int head[1514514]= {-1},fa[1514514][15],deep[1514514],n,m,s;
int num=1;
void insert(int u,int v) {
	es[num].to=v;
	es[num].next=head[u];
	head[u]=num++;
}
void dfs(int x,int fath) {
	fa[x][0]=fath;
	deep[x]=deep[fath]+1;
	for(int i=1; i<=14; i++) {
		fa[x][i]=fa[fa[x][i-1]][i-1];
	}
	for(int i=head[x]; i; i=es[i].next) {
		if(es[i].to!=fath) {
			dfs(es[i].to,x);
		}
	}
}
int lca(int x,int y) {
	if(deep[x]<deep[y])swap(x,y);
	for(int i=14; i+1; i--) {
		if(deep[fa[x][i]]>=deep[y])x=fa[x][i];
	}
	if(x==y)return x;
	for(int i=14; i+1; i--) {
		if(fa[x][i]!=fa[y][i]){
			x=fa[x][i];
			y=fa[y][i];
		}
	}
	return fa[x][0];
}
int main() {
	scanf("%d%d%d",&n,&m,&s);
//	memset(head,-1,sizeof(head));
	for(int i=1; i<n; i++) {
		int u,v;
		scanf("%d%d",&u,&v);
		insert(u,v);
		insert(v,u);
	}
	dfs(s,0);
	for(int i=1; i<=m; i++) {
		int u,v;
		cin>>u>>v;
		printf("%d\n",lca(u,v));
	}
	return 0;
}

没T但subtask全WA

2023/8/29 10:14
加载中...