LCA板子求条
  • 板块灌水区
  • 楼主fedoralxy
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/2/23 22:39
  • 上次更新2024/2/24 10:22:52
查看原帖
LCA板子求条
491542
fedoralxy楼主2024/2/23 22:39
#include<iostream>
#include<cstdio>
#include<vector>
#include<string.h>
#include<functional>
using namespace std;
#define ll long long
const int N=1e3+10;
vector<ll> v[N];
ll fa[N][31],dep[N];
ll n,m,s,a,b;
int main(){
	function<void(ll,ll)>dfs=[&](ll root,ll fno)->auto{
		fa[root][0]=fno,dep[root]=dep[fa[root][0]]+1;
		for(int i=1;i<31;++i)fa[root][i]=fa[fa[root][i-1]][i-1];
		for(auto nxt:v[root]){
			if(nxt==fno)continue;
			dfs(nxt,root);
		}
	};
	auto lca=[&](ll x,ll y){
		if(dep[x]>dep[y])swap(x,y);
		ll dis=dep[y]-dep[x];
		for(int j=0;dis;++j,dis>>=1){
			if(dis&1)y=fa[y][j];
		}
		if(y==x)return y;
		for(int j=30;j>=0&&y!=x;--j){
			if(fa[x][j]!=fa[y][j]){
				x=fa[x][j];
				y=fa[y][j];
			}
		}
		return fa[x][0];
	};
	ll t;
	cin>>t;
	while(--t){
		memset(fa,0,sizeof fa);
		memset(dep,0,sizeof dep);
		cin>>n>>m>>s;
		for(int i=1;i<=n;++i)v[i].clear();
		for(int i=1;i<n;++i){
			cin>>a>>b;
			v[a].push_back(b);
			v[b].push_back(a);
		}
		dfs(s,0);
		for(int i=0;i<m;++i){
			cin>>a>>b;
			cout<<lca(a,b)<<'\n';
		}
	}
	return 0;
}

成功有关注。

2024/2/23 22:39
加载中...