LCA求助
  • 板块学术版
  • 楼主IKUN_LMX
  • 当前回复7
  • 已保存回复7
  • 发布时间2024/7/15 09:18
  • 上次更新2024/7/15 10:23:01
查看原帖
LCA求助
947040
IKUN_LMX楼主2024/7/15 09:18

rt,大佬们为啥我样例后面几个输不出来 (大雾)

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+100;
int n,m,s;
//int a[N*4];
int pre[N*5];
int k=1;
struct re{
	int to,next;
}a[N*5];
void add(int u,int v){
	a[k].to=v;
	a[k].next=pre[u];
	pre[u]=k;
	k++;

}
int f[N][21];
int deep[N*4];
void dfs(int x){
	for(int i=pre[x];i!=0;i=a[i].next){
		if(a[i].to!=f[x][0]){
			f[a[i].to][0]=x;
			deep[a[i].to]=deep[x]+1;
			dfs(a[i].to);
		}
	}
}
int lca(int x,int y){
	if(deep[x]<deep[y])swap(x,y);
	for(int i=20;i>=0;i--){
		if(deep[x]-i*2>=deep[y]){
			x=f[x][i];
		}
	}
	if(x==y) return x;
	for(int i=20;i>=0;i--){
		if(f[x][i]!=f[y][i]){
			x=f[x][i];
			y=f[y][i];
		}
	}
	return f[x][0];
}
int main(){
	cin>>n>>m>>s;
	for(int i=1;i<n;i++){
		int x,y;
		cin>>x>>y;
		add(x,y);
		add(y,x);
	}
	dfs(s);
	for(int j=1;j<=20;j++){
		for(int i=1;i<=n;i++){
			f[i][j]=f[f[i][j-1]][j-1];
		}
	}
	while(m--){
		int x,y;
		cin>>x>>y;
		cout<<lca(x,y)<<'\n';
	}
	return 0;
}

(悬)拜托了

2024/7/15 09:18
加载中...