直径[Usaco2010ホル] cowpol牛政治LCA +ツリー:1776 BZOJ

コード: 

#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を返します。
}

  

おすすめ

転載: www.cnblogs.com/guangheli/p/11243622.html