距離と最も近い点先の三点を求めて、あなたのツリーを与える、との距離を計算
非常に良好なライセンスは、その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(1、0 ); 一方、(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 。 }