萌新初学lca,求助
  • 板块学术版
  • 楼主salute
  • 当前回复12
  • 已保存回复12
  • 发布时间2020/7/29 11:07
  • 上次更新2023/11/6 21:53:09
查看原帖
萌新初学lca,求助
124126
salute楼主2020/7/29 11:07
#include<iostream>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
int head[500005],k=0,d[500005],p[500005][30];
struct h{
	int to,next;
};
h a[1000005];
inline void add(int x,int y){
	a[k].to=y;
	a[k].next=head[x];
	head[x]==k++;
}
inline void h(int x,int fa){
	d[x]=d[fa]+1;
	p[x][0]=fa;
	for(int i=1;(1<<i)<=d[x];i++){
		p[x][i]=p[p[x][i-1]][i-1];
	}
	for(int i=head[x];i!=-1;i=a[i].next){
		int y=a[i].to;
		if(y!=fa)h(y,x);
	}
}
inline int lca(int x,int y){
	if(d[x]>d[y])swap(x,y);
	for(int i=20;i>=0;i--){
		if(d[x]<=d[y]-(1<<i))y=p[y][i];
	}
	if(x==y)return x;
	for(int i=20;i>=0;i--){
		if(p[x][i]==p[y][i])continue;
		x=p[x][i];y=p[y][i];
	}
	return p[x][0];
}
int main(){
	int n,m,s;
	cin>>n>>m>>s;
	memset(head,-1,sizeof(head));
	for(int i=1;i<n;i++){
		int x,y;
		cin>>x>>y;
		add(x,y);add(y,x);
	}
	h(s,0);
	for(int i=1;i<=m;i++){
		int x,y;
		cin>>x>>y;
		cout<<lca(x,y)<<endl;
	}
}

why输出全0

2020/7/29 11:07
加载中...