最初の学位点が明らかその後、$ 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 = - 1。CH = 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 ; }