네트워크 (트리 DP) 2899 루오 밸리

F는 [I] [0]를 나타내고 아버지 수오

F [i]는 [1] 계속 나타내고 그들의

F는 [I] [2] 아들 수오를 나타낸다

사용법 #include <iostream> 
#INCLUDE <cstdio> 
#INCLUDE <CString을> 
#INCLUDE <cmath>
 #DEFINE MN 15500이
 #DEFINE 하는 int 재 등록
 하여  스페이스 성병;
INT F [MN] [ 3 ];
INT (CNT), 헤드 [MN];
INT의 N, M, K, A [MN];
INT 힘 [MN];
구조체 아이 {
     INT의 V, NXT; 
} E [ 2 * MN]; 

보이드 추가 ( INT U, INT V) { 
    전자 [ ++ CNT] .V = V; 
    E [CNT] .nxt =헤드 [U]; 
    헤드 [U] = CNT; 
} 
공극 DP가 ( int로는 유, INT의 FA가) {
 // f는 [U]를 [0] = f는 [U]가 [2] = A [U];
// F [U] [1] = 0; 
INT D = 0x3f3f3f3f ;
대해 (ⅰ 다시 머리 = [U] I, I = E [I] .nxt) {
 INT의 V = E [I] .V;
경우 (V == FA가) 계속 ; 
DP (V U, 께); 
F [U] [ 0 ] + = 분 (F [V] [ 1 ], F [V] [ 2 ]); 
F [U] [ 1 ] + = 분 (F [V] [ 1 ], F [V] [ 2 ]); 
F [U] 2] + = 분 (F [V] [ 0 ], 분 (F [V] [ 1. ], F [V] [ 2 ])); 
D = 분 (D, F [V] [ 2 ]라는 우수한 성능을 나타내었다 (F [V] [ 2 ], F는 [V] [ 1. ))];
 // [. 1] F는 [U]는 [2]라는 우수한 성능을 나타내었다는 (F는 [V], F는 [V] [2]) 다른 아들의 합을 나타낸다 . 
} 
F [U] [ 1. + = D] F [U] [ 2 ] ++ ; 
} 
INT 의 main () { 
    는 scanf ( " %의 D " , 및 N-)를,
  (I = 다시 1. ; I <= N- - . 1 ; I ++ ) {
     INT A1, A2, A3, A4] 
    는 scanf ( " %의 D %의의 D ' , A1,A2); 
    추가 (A1, A2); 
    추가 (A2, A1); 
} 
    DP ( 1 , 0 ); 
    의 printf ( " % D \ 없음 " , 분 (F [ 1 ] [ 1 ], F [ 1 ] [ 2 ]));
반환  0 ; 
}

 

추천

출처www.cnblogs.com/zw130-lzr-blogs/p/11220336.html