tablero de LCA

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 ; 
}

 

Supongo que te gusta

Origin www.cnblogs.com/ljxdtc666/p/12586141.html
Recomendado
Clasificación