コード:
#include <ビット/ STDC ++ H> に#define setIO(S)freopenは(S ".IN"、 "R"、STDIN) の#define 300000をMAXN 名前空間stdを使用。 ベクター<INT> G [MAXN]。 N INT、TOT、根、エッジ。 int型FA [MAXN]。 int型HD [MAXN]、[MAXN]、NEX [MAXN]、トップ[MAXN]、DEP [MAXN]に、息子[MAXN]、[MAXN] SIZ。 ボイドaddedge(INT U、V INT){ NEX [++エッジ] = HD [U]、HD [U] =縁、[エッジ]へ= V。 } ボイドDFS1(UをINT){ DEP [U] = DEP [FA [U] + 1、SIZ [U] = 1。 以下のために(INT I = HD [U]; I; I = NEX [I]){ int型V =乃至[I]。 IF(V == FA [U])続けます。 DFS1(V)、SIZ [U] + = SIZ [V]。 IF(SIZ [V]> SIZ [息子[U])息子[U] = V。 } } 無効DFS2(U int型、 トップ[U]はTPを=。 IF(息子[U])DFS2(息子[U]、TP)。 以下のために(INT I = HD [U]; I; I = NEX [I]){ int型V =乃至[I]。 もし(V == FA [U] || V ==息子[U])続けます。 DFS2(V、V); } } int型LCA(int型のx、int型Y){ 一方(上面[X] ^トップ[Y]){ DEP [トップ[X]]> DEP [Y]トップ[]?X = FA [TOP [X]:Y = FA [トップ[Y]。 } 戻りDEP [X] <DEP [Y]は、x:yの。 } int型のmain(){ // setIO( "入力")。 scanf関数( "%d個の%のD"、&N、&TOT)。 以下のために(; iは= N <; I = int型1 ++ I){ int型TY。 scanf関数( "%D%dの"、&TY、&FA [I])。 もし(FA [i]が!)ルート= I; 他addedge(FA [i]は、I); G [TY] .push_back(I)。 } DFS1(根)、DFS2(根、根)。 以下のために(INT I = 1; I <= TOT; ++ I){ int型MX = 0、ANS = 0。 (; J <G [I] .size(); ++ J {INT J = 0)のための IF(DEP [G [I] [J]]> DEP [MX])MX = G [I] [J] ; } (INT J = 0; J <G [I] .size(); ++ j)のための{ //のprintf( "%D%D \ n"、MX、G [I] [J])。 ANS = MAX(ANS、DEP [MX] + DEP [G [I] [J]] - (DEP [LCA(MX、G [I] [J])] << 1))。 } のprintf( "%d個の\ n"、ANS)。 } 0を返します。 }