Plantilla de enlace del título:
https://www.luogu.com.cn/problem/P3379
el blog de referencia:
https://www.luogu.com.cn/blog/morslin/solution-p3379
código:
#include <iostream> #include <stdio.h> #include <stdlib.h> #include < string .h> #include <pila> utilizando espacio de nombres std; const int MAXN = 5E5 + 5 ; int n, m, s; int cabeza [MAXN], Tot1; int dep [MAXN], f [MAXN] [ 21 ], lg [MAXN]; struct nodo { int a, próximo; } e [MAXN * 3 ]; void add ( int x, int y) { e [Tot1] .para= Y; e [Tot1] .Next = cabeza [x]; cabeza [x] = Tot1 ++ ; } Void dfs ( int u, int fa) { dep [u] = dep [fa] + 1 ; f [u] [ 0 ] = fa; para ( int i = 1 ; i <= lg [dep [u]]; i ++ ) f [u] [i] = f [f [u] [i- 1 ]] [i- 1 ]; para ( int i = cabeza [u]; i = - 1 ; i = E [i] .A continuación) { int v =e [i] .a; si (! v = FA) DFS (v, u); } } Int lca ( int a, int b) { si (dep [a] < dep [b]) swap (a, b); mientras que (dep [a]> dep [b]) un = f [a] [lg [dep [a] -dep [b]] - 1 ]; si (a == b) de regreso a; para ( int k = lg [dep [a]] - 1 ; k> = 0 ; k-- ) si (f [a] [k] =! f [b] [k]) un = f [a] [ k], B =f [b] [k]; volver f [a] [ 0 ]; } Int main () { scanf ( " % d% d% d " , y n, y m, y S); memset (cabeza, - 1 , sizeof (cabeza)); para ( int i = 1 ; i <n; i ++ ) { int x, y; scanf ( " % d% d " , y x, y y); añadir (x, y); añadir (y, x); } Para ( int i = 1 ; i <= n; i ++ ) lg [i] = lg [i- 1 ] + ( 1 << lg [i- 1 ] == i); DFS (s, 0 ); para ( int i = 1 ; i <= m; i ++ ) { int x, y; scanf ( " % d% d " , y x, y y); printf ( " % d \ n " , lca (x, y)); } Volver 0 ; }