1- import java .io .BufferedReader ;
2- import java .io .InputStreamReader ;
3- import java .util .ArrayList ;
4- import java .util .Arrays ;
5- import java .util .StringTokenizer ;
1+ import java .io .*;
2+ import java .util .*;
63
74public class Main {
5+ static List <Integer >[] map ;
6+ static int [] p ;
7+ static int [][] dp ;
88 static int n ;
9- static int [] people ;
10- static int [][] dp ; // dp[i][0]: 선택했을 때 최대 값, dp[i][1]: 선택하지 않았을 때의 최대 값
11- static ArrayList <Integer >[] graph ;
129 static StringTokenizer st ;
1310 static BufferedReader br = new BufferedReader (new InputStreamReader (System .in ));
1411 public static void main (String [] args ) throws Exception {
15- input ();
16- dfs (1 , 0 );
17-
18- System .out .println (Math .max (dp [1 ][0 ], dp [1 ][1 ]));
19-
12+ inputSetting ();
13+ System .out .println (recur (0 , 0 , 0 ));
2014 }
2115
16+ static int recur (int now , int pre , int preflag ){
17+ if (dp [now ][preflag ] != -1 ) return dp [now ][preflag ];
2218
23- public static void dfs (int now , int pre ){
19+ int next , rot ;
20+ dp [now ][preflag ] = 0 ;
21+ for (int i = 0 ; i < map [now ].size (); i ++){
22+ next = map [now ].get (i );
23+ rot = 0 ;
2424
25- int next ;
26- for (int i = 0 ; i < graph [now ].size (); i ++) {
27- next = graph [now ].get (i );
2825 if (next == pre ) continue ;
26+ if (preflag == 0 ) rot = recur (next , now , 1 ) + p [next ];
27+ rot = Math .max (rot , recur (next , now , 0 ));
2928
30-
31- dfs (next , now );
32-
33- //현재 마을이 우수 마을인 경우, dp[now][0]
34- dp [now ][0 ] += dp [next ][1 ]; //뒷 동네는 우수 마을 불가능
35-
36- //현재 마을이 우수 마을이 아닌 경우
37- dp [now ][1 ] += Math .max (dp [next ][0 ], dp [next ][1 ]); //뒷 동네 우수 마을 가능
29+ dp [now ][preflag ]+= rot ;
3830 }
39- dp [now ][0 ] += people [ now ];
31+ return dp [now ][preflag ];
4032 }
4133
42- public static void strToken () throws Exception {
34+ static void inputSetting () throws Exception {
35+ n = Integer .parseInt (br .readLine ());
36+ map = new ArrayList [n + 1 ];
37+ p = new int [n + 1 ];
38+ dp = new int [n + 1 ][2 ];
39+
4340 st = new StringTokenizer (br .readLine ());
44- }
45- public static void input () throws Exception {
46- strToken ();
47- n = Integer .parseInt (st .nextToken ());
41+ for (int i = 0 ; i < n + 1 ; i ++){
42+ map [i ] = new ArrayList <>();
43+ if (i != 0 ) p [i ] = Integer .parseInt (st .nextToken ());
4844
49- people = new int [n + 1 ];
50- dp = new int [n + 1 ][2 ];
51- graph = new ArrayList [n + 1 ];
52- strToken ();
53- for (int i = 1 ; i < n + 1 ; i ++) {
54- graph [i ] = new ArrayList <>();
55- people [i ] = Integer .parseInt (st .nextToken ());
45+ Arrays .fill (dp [i ], -1 );
5646 }
5747
58- int n1 , n2 ;
59- for (int i = 0 ; i < n - 1 ; i ++) {
60- strToken ();
61- n1 = Integer .parseInt (st .nextToken ());
62- n2 = Integer .parseInt (st .nextToken ());
63- graph [n1 ].add (n2 );
64- graph [n2 ].add (n1 );
48+ int a , b ;
49+ for (int i = 0 ; i < n - 1 ; i ++){
50+ st = new StringTokenizer (br .readLine ());
51+
52+ a = Integer .parseInt (st .nextToken ());
53+ b = Integer .parseInt (st .nextToken ());
54+ map [a ].add (b );
55+ map [b ].add (a );
6556 }
57+ map [0 ].add (1 );
58+ map [1 ].add (0 );
6659 }
67-
6860}
0 commit comments