Codeforces 1244D。木をペイント

ポータル

最初の学位点が明らかその後、$ 2 $無ソリューションよりも大きい場合

その後度ポイント以下$ 2 $場合を考えます

私は実際に鎖であることを発見しました

チェーンの最初の点の二点と、後者のカラーポイントは、以前により導入することができます

だから、列挙を指示することができます

#include <iostreamの> 
する#include <cstdioを> 
する#include <アルゴリズム> 
の#include <CStringの> 
する#include <cmath> 
の#include <ベクトル>
 使用して 名前空間STD。
typedefの長い 長いLL。
インラインint型の読み取り()
{
    INT X = 0、F = 1チャー CH = GETCHAR()。
    一方、(CH < ' 0 ' || CH> ' 9 '){ 場合(CH == ' - ')、F = - 1CH = GETCHAR()。}
     一方、(CH> = ' 0 ' && CH <= ' 9 '){X =(X << 1)+(X << 3)+(CH ^ 48)。CH = GETCHAR()。}
     戻りのx *のF。
}
CONSTの INT N = 1E5 + 7 constの LL INF = 1E18;
INT、FIR [N] から [N << 1 ]、[N <<に1 ]、CNTT。
インラインボイドは(追加INT A、INT B){ から [A]を[CNTT ++] =。【と】= CNTTため、【CNTT]に= B。}
 のInt N、NP [N] [ 3 ]、ANS [ 3 ] [ 3 ]、COL [N]、PCOL [N]は、[N]。
ベクトル < int型 > V。
int型のmain()
{
    N = 読み取ります();
    以下のためにint型 i = 0 ; iは< 3 ; iは++ のためにINT J = 1 ; J <= N; J ++)CST [J] [i]は=を読み取ります()。
    以下のためにint型 i = 1 ; iがn <; iは++ 
    {
        INT A = read()は、B = 読み取ります();
        追加(A、B)。(B、A)を加えます。
        あなたの[A] ++; あなたの[B] ++ ;
    }
    以下のためにint型私= 1 ; iが<= N; iが++ 場合(DU [I]> 2){のprintf(" -1の\ n "); リターン 0 ; }
     int型 RT = 0以下のためにint型 I = 1 iは++; iが<= N)であれば(DU [I] == 1){RT = I。破ります; }
     int型プリ= RT、今= [RT] [FIR]に。V.push_back(RT)。
    ながら(DU [今]> 1 のためにint型 ; I; I = I = FIR [今] から[i])と
        {
            INT&V = [I]へ。もし(V ==前)続けます
            V.push_back(今)。前の今=; 今、vは=。破ります;
        }
    V.push_back(今)。
    LL ANS = INF。
    以下のためにint型私= 0 ;私は< 3 ; I ++ のためのint型 J = 0 ; jの< 3 ; J ++)の場合(!I = J)
        {
            INT LEN = V.size()。LLのRESの=は、[V [CST 0 ] [I] + [V [CST 1 ] [j]を。
            PCOL [V [ 0 ] = I。PCOL [V [ 1 ] = J。
            int型、K = 2、K <LEN; ++ k個
            {
                INT C = 0 ; C < 3 ; C ++ であれば(!C = PCOL [V [K- 1!] && C = PCOL [V [K- 2 ])PCOL [V [K] =のC。
                RES + = CST [V [K] [PCOL [V []] K]。
            }
            もし(RES < ANS)
                 のためのINT K = 0 COL [V [K] =; K <LEN ++ K)PCOL [V [K]]。 = 分(年RES);
        }
    printf(" %LLDする\ n " 、ANS)。
    int型 I = 1のprintf(; iが<= N I ++)は、 " %のD "、COL [I] + 1 )。
    プット(""); リターン 0 ;
}

 

おすすめ

転載: www.cnblogs.com/LLTYYC/p/11669434.html