1 条题解

  • 0
    @ 2023-11-1 19:06:35
    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 5e5 + 5;
    vector<int> g[maxn]; 
    int n, m, s, dep[maxn], fa[maxn][21];
    
    void dfs(int u, int p) {
    	dep[u] = dep[p] + 1;
    	fa[u][0] = p;
    	for (auto v : g[u])
    		if (v != p)
    			dfs(v, u);
    }
    
    int lca(int u, int v) {
    	if (dep[u] < dep[v])
    		swap(u, v);
    	for (int i = 20; i >= 0; i--)
    		if (dep[fa[u][i]] >= dep[v])
    			u = fa[u][i];
    	assert(dep[u] == dep[v]);	// 断言 
    	if (u == v) return u;
    	for (int i = 20; i >= 0; i--)
    		if (fa[u][i] != fa[v][i])
    			u = fa[u][i], v = fa[v][i];
    	assert(fa[u][0] == fa[v][0]);
    	return fa[u][0];
    }
    
    int main() {
    	scanf("%d%d%d", &n, &m, &s);
    	for (int i = 1; i < n; i++) {
    		int u, v;
    		scanf("%d%d", &u, &v);
    		g[u].push_back(v);
    		g[v].push_back(u);
    	}
    	dfs(s, 0);
    	for (int i = 1; i <= 20; i++)
    		for (int u = 1; u <= n; u++)
    			fa[u][i] = fa[fa[u][i-1]][i-1];
    	while (m--) {
    		int u, v;
    		scanf("%d%d", &u, &v);
    		printf("%d\n", lca(u, v));
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    16
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    5
    已通过
    4
    上传者