70pts求调
查看原帖
70pts求调
320548
十八子楼主2022/10/20 22:09

绷不住了

#include <bits/stdc++.h>
using namespace std;
int n,m,s;
const int M = 500100;
int head[M],nxt[M],to[M],depth[M],cnt;
int f[M][26];

void add(int f,int t){
    to[++cnt] = t;
    nxt[cnt] = head[f];
    head[f] = cnt;
}

void init(int now=s, int fa=0){    //now表示当前节点,fa表示其父亲节点
	f[now][0] = fa; depth[now]=depth[fa]+1;
	for(int i=1;(1<<i)<=depth[now];i++){
		f[now][i] = f[f[now][i-1]][i-1];
	}
	for(int i=head[now];i!=-1;i=nxt[i]){
		if(to[i]!=fa)init(to[i],now);
	}
}

int lca(int a,int b){
	if(depth[a]<depth[b])swap(a,b);
	for(int i=20;i>=0;i--)
		if(depth[f[a][i]]>=depth[b])a = f[a][i]; //还没到就上跳
	if(a==b)return a;
	for(int k=20;k>=0;k--){
		if(f[a][k]!=f[b][k]){
			a= f[a][k];
			b= f[b][k];
		}
	}
	return f[a][0];
}

int main(){
    memset(head,-1,sizeof(head));
    cin>>n>>m>>s;
    for(int i=1;i<=n-1;i++){
        int f,t;
        cin>>f>>t;
        add(f,t);
        add(t,f);
    }
    init();
    for(int i=1;i<=m;i++){
        int a,b;
        cin>>a>>b;
        cout<<lca(a,b)<<endl;
    }
}
2022/10/20 22:09
加载中...