样例过不掉,求助
查看原帖
样例过不掉,求助
385233
xiekeming26楼主2021/5/28 20:51

LCA写挂了,求助。

#include <bits/stdc++.h>
#define N 500000 + 10
using namespace std;
inline int read() {
	int f = 1 , x = 0;
	char ch = getchar();
	for(;!isdigit(ch);ch=getchar()) if(ch == '-') f = -1;
	for(;isdigit(ch);ch=getchar()) x = x * 10 + (ch - '0');
	return f * x;
}

int n , m , s;
int x , y;
vector <int> G[N];
int dep[N];
int fa[N][23];
int Log[N];
void Loginit(){
	Log[1] = 0;
	for(int i=2;i<=n;i++) {
		Log[i] = Log[i/2] + 1;
	}
	return ;
}
void dfs(int u , int father) {
	fa[u][0] = father, dep[u] = dep[father] + 1;
	for(int j=1;j<=Log[dep[u]];j++) {
		fa[u][j] = fa[fa[u][j-1]][j-1];
	}
	for(int i=0;i<G[i].size();i++) {
		int v = G[u][i];
		if(v != father)  dfs(v,u);
	}
	return ;
}
void pre() {
	Loginit();
	dfs(s,0);
}
int LCA(int x , int y) {
	if(dep[x] < dep[y]) swap(x,y);
	while(dep[x] > dep[y]) {
		x = fa[x][Log[dep[x]-dep[y]]];
	}
	if(x == y) return x;
	for(int k = Log[dep[x]];k;k--) {
		if(fa[x][k] != fa[y][k]) {
			x = fa[x][k] , y = fa[y][k];
		}
	}
	return fa[x][0];
}
int main(){
	n = read() , m = read() , s = read();
	for(int i=1;i<n;i++) {
	   x = read() , y = read();
	   G[x].push_back(y);
	   G[y].push_back(x);
	}
	pre();
	while(m--) {
		x = read() , y = read();
		printf("%d\n",LCA(x,y));
	}
	return 0;
}
2021/5/28 20:51
加载中...