長い時間のように裸の特別な感情を検索してから、私たちは木のDP 300のサイズは、検索に行きました
層の検索によって層
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 #define MAX(X、Y)(X)<(Y)?(Y):( X) の#define MIN(X、Y)(X)<(Y)?(X):( Y) の#defineが長いっ長い の#define RGレジスタ のconst int型 N = 500 + 5、M = 1000000 + 5、INF = 0x3f3f3f3f、P = 9999973 。 const int型パワー= 4、ベース = 10000 。 INTの N、M、ANS = INF、MXD、DEP [N]、キュア[N]、F [N]。 INT VEC [N] [N]、SZ [N]。 テンプレート< クラス T> ボイド RD(T&X){ X = 0。INT W = 0。CHAR CH = 0 。 しばらく W | = CH ==(isdigit(CH)!)' - '、CH = getchar関数(); 一方、(isdigit(CH))X =(X << 1)+(X << 3)+(CH ^ 48)、CH = GETCHAR()。 X?= W - X:X; } int型のヘッド[N]、TOT = 0 。 構造体のエッジ{ int型 V、NXT;} E [N << 1 ]。 ボイド追加(INT U、INT V){ E [ ++ TOT =(エッジ){V、ヘッド[U]}、ヘッド[U]は= TOT。 } ボイド DFS1(int型 Uを、INT FA){ DEP [U] = DEP [FA] + 1、F [U] = FA、VEC [DEP [U]は] [++ SZ [DEP [U]]] = U 、MXD = MAX(MXD、DEP [U])。 以下のために(int型私=;;私は[U] I =ヘッドをE [i]を.nxt) 場合(!E [i]は.V = FA)DFS1(E [i]の.V、u)は、 } ボイドタグ(INT U、INT COL){ キュア[U] = COL。 以下のための(int型I =ヘッド[U]; I; I = E [I] .nxt) もし(E [I] .V =!F [U])タグ(E [I] .V、COL)。 } INT get_sum(INT 深い){ int型の和= 0 。 以下のために(int型 I = 1 ; I <= SZ [深い]; ++ I) であれば ++(治療[VEC [深い] [I]]!)の合計。 戻り値の合計。 } ボイド DFS2(INT深い、INT CO){ 場合(CO> = ANS)のリターン; もし(深い> MXD ||!get_sum(深い)){ ANS =MIN(ANS、CO); 返します。 } のための(int型 I = 1、V; I <= SZ [深い]; ++ I){ V = VEC [深い] [I]。 もし(硬化が[V])続けます。 タグ(V、1 )。 DFS2(深い + 1、CO + get_sum(深いです))。 タグ(V、0 ); } } int型のmain(){ freopenは(" in.txt "、" R " 、STDIN)。 RD(n)は、RD(M)。 以下のための(int型 I = 1、I <= M; ++、U、V I) RD(U)、RD(V)は、V)、(UをVを追加する、(Uを追加)。 memset(DEP、0、はsizeof(DEP)); DFS1(1、0 ); DFS2(2、1 )。 printf(" %dの" 、ANS)。 リターン 0 ; }