倍增0分求调
查看原帖
倍增0分求调
630221
wzhUGFK楼主2023/8/13 12:57
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
const int SIGN=19;
int n,m,a,b,s,f,t,deep[N],anc[SIGN][N];
vector<int>v[N];

void dfs(int u,int fa){
	deep[u]=deep[fa]+1;
	anc[0][u]=fa;
	for(int i=1;i<=SIGN;i++)anc[i][u]=anc[i-1][anc[i-1][u]];
	for(int i=0;i<v[u].size();i++){
		if(v[u][i]==fa)continue;
		dfs(v[u][i],u);
	}
}

int getlca(int x,int y){
	if(deep[x]<deep[y])swap(x,y);
	for(int i=SIGN;i>=0;i--)
	 if(deep[anc[i][x]]>=deep[y])x=anc[i][x];
	 if(x==y)return x;
	 for(int i=SIGN;i>=0;i--){
	 	if(anc[i][x]!=anc[i][y])x=anc[i][x],y=anc[i][y];
	 }
	 return anc[0][x];
}

int main(){
	ios::sync_with_stdio(false);
    cin>>n>>m>>s;
    for(int i=1;i<n;i++){
    	cin>>f>>t;
    	v[f].push_back(t),v[t].push_back(f);
	}
	dfs(s,0);
	for(int i=1;i<=m;i++){
		cin>>a>>b;
		cout<<getlca(a,b)<<endl;
	}
    return 0;
}
2023/8/13 12:57
加载中...