球球看错误,是dfs块死循环了。
查看原帖
球球看错误,是dfs块死循环了。
895312
Archy_楼主2024/7/15 09:41
#include <iostream>
#include <cstdio>
using namespace std;

const int M = 100000;
const int N = 10000;
int son[N], dep[N], size[N], top[N], fa[N], id[N];
int n, m, q, s, cnt = 1, dfscnt, head[N];

inline int rd(){
	int x = 0, w = 1;
	char c = getchar();
	while(c < 48 || c > 57){
		if(c == 45) w *= -1;
		c = getchar();
	}
	while(c >= 48 && c <= 57){
		x = (x << 1) + (x << 3) + (c ^ 48);
		c = getchar();
	}
	return x * w;
}

struct node {
	int to, next, w;
} e[M];

void addi(int u, int v) {
	e[++cnt].to = v;
	e[cnt].next = head[u];
	head[u] = cnt;
}
void add(int u, int v) {
	addi(u, v);
	addi(v ,u);
}

void dfs1(int x, int faa, int depth) {
	size[x] = 1;
	fa[x] = faa;
	dep[x] = depth;
	int mmax = -1;
	for(int i = head[x]; i; i = e[i].next) {
		int v = e[i].to;
		if(v == faa) continue;
		dfs1(v, x, depth + 1);
		size[x] += size[v];
		if(size[v] > mmax) {
			son[x] = v;
			mmax = size[v];
		} 
	}
}

void dfs2(int x, int topf) {
	top[x] = topf;
	if(son[x]) dfs2(son[x], topf);
	for(int i = head[x]; i; i = e[i].next) {
		int v = e[i].to;
		if(v == fa[x] || v == son[x]) continue;
		dfs2(v, v);
	}
}

int lca(int x, int y) {
	while(top[x] != top[y]) {
		if(dep[top[x]] > dep[top[y]]) swap(x, y);	
		x = fa[top[x]];
	}
	return dep[x] > dep[y] ? y : x;
}

int main() {
	n = rd(), q = rd(), s = rd();
	for(int i = 1; i <= n - 1; i++) {
		int u = rd(), v = rd();
		add(u, v);
	}
	dfs1(s, s, 1);
	dfs2(s, s);
	while(q --) {
		int x = rd(), y = rd();
		cout<<lca(x, y)<<"\n";	
	}
	return 0;
}
2024/7/15 09:41
加载中...