dfs 序求 LCA WA 求调
查看原帖
dfs 序求 LCA WA 求调
542128
liyixin0514楼主2024/10/8 20:52

rt.

#include<bits/stdc++.h>
#define LOCAL
#define sf scanf
#define pf printf
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define per(x,y,z) for(int x=y;x>=z;x--)
using namespace std;
typedef long long ll;
const int N=5e5+7;
int n,m,rt;
int u,v;
struct edge {
	int to,ne;
}e[N<<1];
int head[N],cnt;
inline void addedge(int u,int v) { e[++cnt] = {v,head[u]}, head[u]=cnt ; }
int num,dfn[N];
int st[N][20];
int f[N];
void dfs(int u,int fa) {
	f[u]=fa;
	dfn[u]=++num;
	st[num][0]=u;
	for(int i=head[u];i;i=e[i].ne) {
		int v=e[i].to;
		if(v==fa) continue;
		dfs(v,u);
	}
}
inline int _min(int l,int r) {
	return dfn[l]<dfn[r]?l:r;
}
int main() {
    #ifdef LOCAL
    freopen("in.txt","r",stdin);
    freopen("my.out","w",stdout);
    #endif
	sf("%d%d%d",&n,&m,&rt) ;
	rep(i,1,n-1)  {
		sf("%d%d",&u,&v);
		addedge(u,v), addedge(v,u);
	}
	dfs(rt,0);
	int lg=__lg(n);
	rep(k,1,lg) {
		for(int i=1;i+(1<<k)-1<=n;i++) {
			st[i][k]=_min(st[i][k-1],st[i+(1<<(k-1))][k-1]);
		}
	}
	rep(i,1,m) {
		sf("%d%d",&u,&v);
		if(u==v) pf("%d\n",u);
		else {
			int mn=min(dfn[u],dfn[v])+1,mx=max(dfn[u],dfn[v]);
			lg=__lg(mx-mn+1);
			pf("%d\n",f[_min(st[mn][lg],st[mx-(1<<lg)+1][lg])]);
		}
	}
}
2024/10/8 20:52
加载中...