cf1286B--建設、ヒューリスティックマージ

/ * 
アイデア:ツリー上の参照DSU、底部から合流アップ
各葉ノードには、合成各息子順番に各ノードの初期値を、割り当てられている
現在のノードのサブツリーIncorporatedの衝突を防止するためにすべてのノードは、再番号付けされている必要があり
、それらがノードに挿入するので、最終的にはサブツリーに入る現在のノードのように再度付け替え
再番号付けされるべき各アップをn回、Oの複雑さ(N ^ 2 )
* / 
の#include <ビット/ STDC ++ H> 
の#include <ベクトル>
 使用して 名前空間STD;
 の#define N 2005 INT N-、P [N]、C [N]、ID [N]; 
ベクター < INT > G [N ]; 
ベクター < INT > サブツリー[N];
 int型根、ボイド DFS(INT U、INT {PRE)
     IF(G [U] .size()== 1



&&事前== 0 ){ 
        サブツリー[U] .push_back(U)。
        ID [U] = 1リターン; 
    } 
    
    のための(自動V:G [U])
         であれば(!= V PRE)DFS(V、U)。
        
    int型 TOT = 0 ;
    (オートV:G [U])場合(V =!PRE){
         ための(自動X:サブツリー[V]){ 
            サブツリー[U] .push_back(X)。
            ID [X] + = TOT。
        } 
        TOT + = サブツリー[V] .size()。
        サブツリー[V] .clear(); 
    } 
    
    スタック <int型 > STK。
    一方、(stk.size())stk.pop(); 
    
    一方、(サブツリー[U] .size()> = C [U]){ 
        stk.push(サブツリー[U] .back())。
        サブツリー[U] .pop_back()。
    } 
    サブツリー[U] .push_back(U)。
    ID [U] = C [U]。
    一方、(stk.size()){
         int型今= stk.top(); stk.pop()。
        ID [今] ++ ; 
        サブツリー[U] .push_back(今)。
    } 
} 

int型のサイズ[N]。
ボイドのgetSize(INT U、INT PRE){ 
    サイズ[U] = 1;
    (オートV:G [U]){
         場合(V ==予備)を続けます
        getSize(V、U);サイズ[U] + = サイズ[V]。
    } 
} 

int型のmain(){ 
    CIN >> N。
    以下のためにINT iが= 1 ; I <= N; I ++ ){ 
        CIN >> P [I] >> C [i]は、
        C [i]の ++ ; 
        G [i]が.push_back(P [I])。
        G [P [I]一back(I)。
        もし(P [I] == 0)ルート= I。
    } 
    
    のgetSize(根、0 );
    にとってINTは iは= 1 ; I <= N; I ++ 場合(サイズ[I] < C [I]){ 
            プット(" NO ")。リターン 0 ; 
        } 
    
    DFS(ルート、0 ); 
    プット(" YES " );
    以下のためにINT iが= 1 ; I <= N; I ++)COUT << ID [I] << "  " 
}

おすすめ

転載: www.cnblogs.com/zsben991126/p/12159094.html