点線ルールテンプレートのタイトル

https://www.luogu.org/problem/P3806

#include <ビット/ STDC ++ H.>
 使用して 名前空間STD; 

のconst  int型 MAXN = 2E4 + 10 ;
 int型のヘッド[MAXN]、版[MAXN]、NXT [MAXN]、エッジ[MAXN];
 int型TOT;
 int型 [MAXN] VISします。// 重心をマークするために使用されているパーティションが使用された場合
、INTのANS、サイズ[MAXN]、根、SUM; 
 // 重心を求めて使用し、ANS記録マークは、現在、最小サイズの木のフォーカス、サイズ記録サブツリーのサイズのルートであります重心のパーティションサブツリーの現在のサイズの和 
 // 地図<整数、整数> M; 
int型の M [ 100000000 ]、MCNT、MM [MAXN]; // M [I]はルートに各子ノードをタグ付けするために使用しました距離iが存在する、またはTをクリアするために使用される場合、M個のMM 
INT DIS [MAXN]、扁[MAXN]、CNT; // 各DIS現在の距離に[i]が記録サブルートノード、扁本記録から
INTQ [ 1005 ]、裁判官[ 1005 ];  
int型N、K。

ボイド追加(int型のx、int型の Y、int型Z)
{ 
    版[ ++ TOT = Y。
    エッジ【TOT] = Z; 
    NXT [TOT] = 頭部[X]。
    ヘッド[X] = TOT。
} 
ボイド dfs_find(int型のx、int型 FA)// 求重心
{ 
    サイズ[X] = 1 int型 max_part = 0 ;
    以下のためのint型I =ヘッド[X]。私; I = NXT [I])
    { 
        int型、Y = [I]版。
        もし(Y == FA || VIS [Y])続けます
        dfs_find(Y、X)。
        サイズ[X] + = サイズ[Y]。
        max_part = MAX(max_part、サイズ[Y])。
    } 
    max_part = MAX(max_part、sum- サイズ[X])。
    もし(ANS> max_part)
    { 
        ANS = max_part。
        ルート =のX。
    } 
} 

ボイド DFS(int型のx、int型FA)
{ 
    扁[CNT ++] = ; DIS [X]
     のためのint型 ; I; I =頭[X]をI = NXT [I])
    { 
        int型 Y = 版[I];
         IF(VIS [Y] FA == Y || )続行; 
        DIS [Y] =エッジ[I] + DIS [X]; 
        DFS(Y、X); 
    } 
} 
ボイド(解決INT X)// 解決するパーティションサブツリーを、各時間重心サブツリーに。
{ 
    MCNT = 0 ;
     のためのint型 ; I I = I =頭[X]をNXT [I])
    { 
        CNT = 0 ;
         int型 Y =[i]の版。
        DIS [Y] = エッジ[I]。
        もし(VIS [Y])続けます
        DFS(Y、X)。
        INT J = 1 ; J <= CNT; J ++ 
        { 
            ためのint型、L = 1リットル++; L <= K であれば(Q [L] -bian [J]> = 0 &&(M [Q [L ] -bian [J]] == 1 || Q [L] == 扁[J]))
                    裁判官[L] = 1 
        } 
        のためのint型 J = 1 ; J <= CNT; J ++  
        {
            M [扁[J] = 1 
            MM [ ++ MCNT] = 扁[J]。
        } 
    } 
    のためにint型 I = 1 ; I <= MCNT; iは++ 
        M [mmの[I] = 0 ; 
} 
ボイド除算(INT X)//   划分子树
 { 
    VIS [X] = 1 
    (x)を解きます。
    以下のためにint型 I =ヘッド[X]; I; I = NXT [I])
    { 
        int型、Y = 版[I];
        もし(VIS [Y])続行
        ANS =和= サイズ[Y]。                          
        dfs_find(Y、0 ); 
        除算(ルート)。
    } 
} 

int型のmain()
{ 
    scanf関数(" %D%dの"、&​​N&K)。
    以下のためにint型 iは= 1 ; iが<= N- 1、I ++ 
    { 
        int型、B、Cと、
        scanf関数(" %D%D%D "、&​​、&B、&C)。
        (A、B、C)を加えます。
        (B、C)を追加します。
    } 
    のためのINT I = 1; 私は= Kを<。I ++ 
        のscanf(" %dの"、&Q [I])。
    ANS =和= N。
    dfs_find(10 ); 
    除算(ルート)。
    int型 i = 1 ; iが= Kを<; Iは++ 
    { 
        場合(裁判官[i])とのprintf(" AYE \ n " );
        のprintf(" NAYの\ nを" ); 
    } 
}

 

おすすめ

転載: www.cnblogs.com/dongdong25800/p/11567160.html