为什么有一个点WA了啊啊啊啊啊
查看原帖
为什么有一个点WA了啊啊啊啊啊
1024631
Howells楼主2025/6/17 21:51

测试点链接\

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 500010, MAXM = 500010;
int n, m, s, fa[MAXN][21]={{0}}, dep[MAXN];
vector <int> edge[MAXN];


void dfs(int node, int father){
	dep[node] = dep[father] + 1;
	fa[node][0] = father;
	for (int i=1;i<=20;++i) {
		fa[node][i] = fa[fa[node][i-1]][i-1];
	}
	for (auto son : edge[node]){
		if (son != father) dfs(son, node);
	}
}


int lca(int node1, int node2){
	if (dep[node1] < dep[node2]) swap(node1, node2);
	if (node1 == node2) return fa[node1][0];
	for (int i=19;i>=0;i--){
		if (dep[fa[node1][i]] >= dep[node2]) {
			node1 = fa[node1][i];
		}
	}
	if (node1 == node2) return node1;
	for (int i=19;i>=0;i--){
		if (fa[node1][i] != fa[node2][i]){
			node1 = fa[node1][i];
			node2 = fa[node2][i];			
		}
	}
	return fa[node1][0];
}


int main(){
	cin>>n>>m>>s;
	for (int i=1;i<n;++i){
		int u, v;
		cin>>u>>v;
		edge[u].push_back(v);
		edge[v].push_back(u);
	}
	dep[0] = 0;
	dfs(s, 0);
	for (int i=1;i<=m;++i){
		int a, b;
		cin>>a>>b;
		cout<<lca(a, b)<<endl;
	}
	return 0;
}

2025/6/17 21:51
加载中...