その後、DPはの木である、あなたは二重の縁が行くのは自由でなければならない見つけることができますので、我々はエッジのアートワークを切削見つけ、その後、2点のエッジに縮小ます。
#include <ビット/ STDC ++ H> の#defineは長い長いllの 名前空間stdを使用します。 const int型N = 200005; #define PB一back インラインINT読み出す(){ int型のx = 0。チャーCH = GETCHAR()。 用(;!isdigit(CH); CH = getchar関数()); 用(; isdigit(CH)、CH = GETCHAR())X = X * 10 + CH-'0' 。 Xを返します。 } ベクトル<整数> G [N]。 N INT、[N]、DFN [N]、低[N]、LT [N]、K、SIZ [N]。 int型のHD [N]、NE [N * 2]乃至[N * 2]、NUM = 1、TOT [N]、DC、M、S。 LLのLTW [N]、ANS、M、MX [N]。 BOOL禁止[N * 2]。 インラインボイド追加(int型のx、int型のY){ [++ NUM] = yに、NE [NUM] = HD [x]は、HD [X] = NUM。 } ボイドDFS(int型のx、int型FA){ [X] DFN =低[X] = ++ DC。 ([I] = FAに!)であれば(;; I I =北東[i]はI = HD [X]をint型)について (もし!DFN [に[I]]){ 低DFS([I]に対して、X)、[X] =分([I]に低、[x]は低いです)。 IF(低[する[I]]> =のDFN [乃至[I])禁止[I] =禁止[I ^ 1] = 1。 } そうでなければ低[X] =分(低[X]、[I]乃至] DFN)。 } ボイドB(INT X){ LT [X] = K、LTW [K] + = [X]、SIZ [K] ++; IF(!禁止[I] && LT [する[I]]!)B(の[I])が(; Iを、I =北東[I] I = HD [X]をINT)。 } ボイドDP(int型のx、int型FA){ TOT [X] = SIZ [X]> 1。 IF(!I = FA){(G [x]の値int i)に対する DP(I、x)は、[X] + = TOT [i]は、MX TOT [X] = MAX(MX [x]は、MX [私]); } MX [X] + = LTW [X]。 IF(TOT [X])ANS + = LTW [X]。 他M = MAX(M、MX [X])。 } インラインボイド{)(解く 場合DFS(I、I)(; iは<= n iは++ i = 1 INT)のために(DFN [I]!)。 もしK ++、B(i)について(iは++; iがn = <I = 1 INT)(LT [I]!)。 以下のために(INT i = 1; iが<= N; iは++します) 。G [jへの[LT [I] PB(LT [(![J]に] LT [I] = LT)IF(J = NE [J]; J INT J = HD [i])とするための]])。 DP(LT [S]、0); ANS + = M。 } インラインボイド検査(){ COUT << K <<」「<< LT [S] << ENDL。 {ため(; iは= Kを<I ++はI = 1 INT) COUT << iが<< "のサイズは、" << SIZ [I] << ENDL。 COUT << J <<」「;(G [i]がINTのJ)のために coutの<<てendl; } } int型のmain(){ N =)(読み取り、M =読み取ります(); [I] =(リード)(; iが<= N I ++はiは1 = INT)のために、 用(INT I = 1、U、V、I <= M; I ++)U =(uとV)を(u、v)は、追加、V =)(リード)(リード。 S =)は(読み取り)(解きます。 coutの<< ANS <<てendl; // 小切手(); 0を返します。 }