LCA模板
  • 板块灌水区
  • 楼主Wangbingxiang
  • 当前回复5
  • 已保存回复6
  • 发布时间2024/9/18 21:20
  • 上次更新2024/9/19 10:03:01
查看原帖
LCA模板
889828
Wangbingxiang楼主2024/9/18 21:20

@Florrer_A

#include<bits/stdc++.h>
using namespace std;
int n,m,s,x,y;
int cnt,head[500001],dep[500001],f[500001][21];
struct Edge{
    int next,to;
}e[500001*2];
void add(int x,int y){
    e[++cnt].to=y;
    e[cnt].next=head[x];
    head[x]=cnt;
}
void dfs(int s,int d){
    dep[s]=dep[d]+1;
    f[s][0]=d;
    for(int i=1;i<=20;i++){
    	f[s][i]=f[f[s][i-1]][i-1];
	}
	for(int i=head[s];i;i=e[i].next){
		int p=e[i].to;
		if(p==d) continue;
		dfs(p,s);
	}
}
int LCA(int x,int y){
    if(dep[x]<dep[y]) swap(x,y);
    for(int i=20;i>=0;i--){
    	if(dep[f[x][i]]>=dep[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++){
        cin>>x>>y;
        add(x,y);
        add(y,x);
    }
    dep[s]=1;
    dfs(s,0);
    while(m--){
    	cin>>x>>y;
    	cout<<LCA(x,y)<<endl;
	}
    
    return 0;
}
2024/9/18 21:20
加载中...