LCA

LCA

定义


\(树上两点向上跳到最近の重点\)

        1  
       / \ 
      2   3 
     / \   \ 
    4   5   6 
    // LCA( 4 , 5 ) = 2 ;
    // LCA( 2 , 6 ) = 1 ;  

如何求


倍增思想

设$x_1、x_2、x_3 ···· x_k \in Z $

总会有 \(\alpha\) = $ 2^{ x_1 } + ··· + 2^{ x _ k } $

( 不是很需要证 ... )

∴ 从大往小里跳

$ queryfather[ x ][ i ] = queryfather[ \ \ queryfather[ x ][ i - 1 ] \ \ ][ i - 1 ] $

$ code: $

void peikongLca( )
{
    for( int i = 1 ; i <= n ; ++ i )
    {
        for( int j = 1 ; j < 20 ; ++ j )
        {
            queryfather[ i ][ j ] = queryfather[ queryfather[ i ][ j - 1 ] ][ j - 1 ] ; 
        }
    }
}

求LCA

先把小的往上跳使深度相同

再一起往上跳

$\color{red} 注 \ \ \ \ \ \ 意 \ \ ! \ \ ! \ \ ! \ \ ! $

要跳到距LCA 1距离

posted @ 2024-01-26 19:45  HANGRY_Sol&Cekas  阅读(13)  评论(0编辑  收藏  举报