タイトル[ブラシ] [LCA]緊急コレクション/収集

距離と最も近い点先の三点を求めて、あなたのツリーを与える、との距離を計算

非常に良好なライセンスは、そのLCAの3つの短いです

しかし、このタイトルカードは、多くの場合、スキル、QAQを要求します

その後、まだああ20ポイント、多くの場合、カードを追加するスキルの習慣を開発する必要があります

書式#include <cstdioを> 
する#include <cstdlib> 
書式#include <ベクトル>
 使用して 名前空間はstdを、
INTのN、M。
const  int型 N = 500003 ;
INTのTOT、ヘッド[N]。
構造体ノード
{ 
    int型V、NX。
} E [N << 1 ]。
ボイド追加(INT U、INT V)
{ 
    E [ ++ TOT] .V = V、E [TOT] .nx =頭部[U]、ヘッド[U]は= TOT。
    E [ ++ TOT] .V = U、E [TOT] .nx =頭部[V]、ヘッド[V] = TOTを、
} 
int型の FA [N] [ 20]、DEP [N]。

インラインint型リード()
{ 
    int型のx = 0チャー C = GETCHAR()。
    一方、(C < ' 0 ' || C> ' 9 ')C = GETCHAR()。
    一方、(C> = ' 0 ' && C <= ' 9 ')X =(X << 1)+(X << 3)+ C- ' 0 '、C = GETCHAR()。
    リターンのx; 
} 

無効 DFS(int型 RT、
    DEP [RT] = DEP [F] + 1 
    FA [RT] [ 0 ] = F。
    以下のためにint型 i = 1 ; iは< 20 && FA [RT] [I- 1 ]; iは++ 
        FA [RT] [I] = FA [FA [RT] [I- 1 ]] [I- 1 ]。
    
    以下のためのint型 ; I; I =ヘッド[RT] I = E [i]は.nx)
         であれば(!E [i]は.V = F)
            DFS(E [i]の.V、RT)。
} 
int型 LCA(int型のx、int型のY)
{ 
    場合(DEP [X] < DEP [Y])
        X + = Y、Y = X-Y、X - = Y。
    INT DIS = DEP [X] - DEP [Y]。
    以下のためにint型 I = 1、J = 0 ; I <= DIS I << = 1、J ++ 場合(DIS&I)X = FA [X] [J]。
    もし(x == y)は戻りX。
    
    以下のためにint型 I = 19 ;〜I; i-- であれば(!FA [X] [I] = FA [Y] [i])と
            、X = FA [X] [i]は、Y = FA [Y] [私]; 
    戻り FAを[X] [ 0 ]。
} 

int型)(主
{
    N = read()は、M = read()は、
    int型U、V、W;
    以下のためにint型 i = 1 ; iがn <I ++の
        U =は、V = read()は、read()は追加(U、V)。
    DFS(10 );   
    
    一方、(M-- 
    { 
        U =読み取る()、V =読み取る()= W )(読み取ります。
        INT = LCA(U、V)、B = LCA(U、W)、C = LCA(V、W)。
        
        INT ANS = DEP [U] + DEP [V] + DEP [W]、POS。
        もし(DEP [A] == DEP [B])
            ANS - = DEP [A] * 2 + DEP [C]、POS =のC;
        (DEP [A] ==他の 場合DEP [C])
            ANS - = DEP [A] * 2 + DEP [B]、POS = B。
         ans- = DEP [B] * 2 + DEP [A]、POS = 
        printf(" %D%D \ n " 、POS、ANS)。
    } 
    
    戻り 0 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/xwww666666/p/11668461.html