ํธ๋ฆฌ ํํ์ง๋ง ์๋ฐฉํฅ์ด๊ธฐ ๋๋ฌธ์ ๋ฃจํธ ๋ ธ๋๋ ์ด๋ ๋ ธ๋๊ฐ ๋์ด๋ ์๊ด ์๋ ๊ตฌ์กฐ์ด๋ค. ๋ฌธ์ ๋ง ์ฝ์ผ๋ฉด ๋ง์ ํ๋๋ฅผ ์ ํํ๊ณ ๊ทธ ๋ค์ ๋ง์์ ๊ฑด๋๋ฐ๋ ์์ผ๋ก๋ง ํ๋ฉด ๋ ๊ฒ ๊ฐ์ง๋ง ์ค์ ๋ก ์์ ๋ฅผ ๋ณด๋ฉด ์๋์ ๊ฐ์ ๊ฒฝ์ฐ๋ ๊ฐ๋ฅํ๋ค.
2 - 6 ์ ์๋ก ์ธ์ ํด์์ง๋ง ๋ ๋ค ์ฐ์ ๋ง์์ ์๋๋ค. ํ์ง๋ง ๊ฐ์๊ฐ ์ฐ์ ๋ง์๊ณผ ์ธ์ ํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์กฐ๊ฑด์ ๋ง์กฑํ ์ ์๋ค. ์ด๋ ๊ฒ ๋ค ๊ฐ์ ๋ง์์ ์ ํํ ๊ฒฝ์ฐ๊ฐ 14000์ผ๋ก ์ต๋๊ฐ ๋ ์ ์๋ค.
๋ชจ๋ ๋ ธ๋๋ ์ ํ๋๊ฑฐ๋ ์ ํ๋์ง ์๋ ๋ ๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ์กด์ฌํ ์ ์๋ค. ๋ง์ฝ ํ์ฌ ๋ ธ๋๊ฐ ์ ํ์ด ๋์๋ค๋ฉด ํ์ฌ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ ธ๋๋ค์ ์ ํ๋๋ฉด ์ ๋๋ค. ๋ฐ๋๋ก ํ์ฌ ๋ ธ๋๊ฐ ์ ํ๋์ง ์์๋ค๋ฉด, ์ฐ๊ฒฐ๋ ๋ ธ๋๋ค์ ์ ํ๋ ์๋ ์๊ณ ์ ํ๋์ง ์์ ์๋ ์๋ค. ์์ 2-6๊ณผ ๊ฐ์ ๊ด๊ณ์ฒ๋ผ 2๊ฐ ์ ํ๋์ง ์์ ๊ฒฝ์ฐ 6๋ฒ ๋ ธ๋๋ ์ ํ๋ ์๋ ์๊ณ ์๋ ์๋ ์๋ ๊ฒ์ด๋ค. ์ค์ํ ๊ฒ์ ์ต๋๊ฐ์ ๊ตฌํ๋ ๊ฒ์ด๋ฏ๋ก 6์ ์ ํํ์ง ์๋ ๊ฒ์ด ์ ํํ๋ ๊ฒ๋ณด๋ค ๋ ๋์ ๊ฐ์ ๊ฐ์ง ์ ์๋ค๋ฉด ์ ํํ์ง ์๋ ๊ฒ์ด ์ ๋ฆฌํด์ง๋ค. ์์ ์์๋ 7๋ฒ ๋ ธ๋๊ฐ 7000์ด๊ธฐ ๋๋ฌธ์ 7๋ฒ ๋ ธ๋๋ฅผ ์ ํํ๊ณ 6๋ฒ์ ์ ํํ์ง ์๋ ๊ฒ์ด ์ต๋๊ฐ์ ๊ฐ์ง๊ธฐ์ ์ ๋ฆฌํ๋ค.
N๊ฐ์ ํ์ ๋ํด 2๊ฐ์ ์ด์ ๊ฐ์ง๋ dp ๋ฐฐ์ด์ ์ ์ธํ๊ณ ํด๋น ๋ ธ๋๋ฅผ ์ ํํ ๊ฒฝ์ฐ ๊ตฌํ ์ ์๋ ์ธ๊ตฌ์ ํฉ์ 0์ด์ ์ ํํ์ง ์๋ ๊ฒฝ์ฐ๋ฅผ 1์ด์ ์ ์ฅํ๋ค๊ณ ๊ฐ์ ํ์. ํ์์ ์์๋ ํธ๋ฆฌ์ ์๋ฃ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ์ ๋ฃจํธ ๋ ธ๋์์ ์์ํด์ ๋ฆฌํ ๋ ธ๋๊น์ง ํ์ํ ํ ๋ฆฌํ ๋ ธ๋์์๋ถํฐ ๋ค์ ๊ฑฐ๊พธ๋ก ๊ณ์ฐํด๋์ค๋ ๋ฐฉ์์ด ํธ๋ฆฌํ๋ค. ์๋ฐฉํฅ์ด๊ธฐ ๋๋ฌธ์ ๋ฃจํธ ๋ ธ๋๋ฅผ ์ด๋ค ๋ ธ๋๋ก ์ ์ ํด๋ ์๊ด์ด ์๊ณ ๋ฆฌํ ๋ ธ๋๋ ๋ฑ ์๋ผ ๋ฆฌํ ๋ ธ๋๋ผ๊ณ ํ๊ธฐ๊ฐ ์ด๋ ต๋ค. ๊ทธ๋์ visited ๋ฐฐ์ด์ ํตํด์ ์๋ฌด ๋ ธ๋๋ ๋ฃจํธ ๋ ธ๋๋ก ์ก์์ ์ ํํ ํ ์ฐ๊ฒฐ๋ ๋ ธ๋๋ค๋ก ์ด๋ํ๋ฉด์ ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๋ ธ๋๋ค์ ๋ํด์๋ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํด์ ์ ์ธํ๋ ๋ฐฉ์์ผ๋ก ๋ฆฌํ ๋ ธ๋๋ฅผ ์ฐพ๋๋ค.
์ฐ์ ๋ฐฉ๋ฌธํ ๋ ธ๋์ ๋ํด์๋ ํด๋น ๋ ธ๋๋ฅผ ์ ํํ ๊ฒฝ์ฐ๋ ๋ฐ๋์ ํด๋น ๋ ธ๋์ ํด๋นํ๋ ์ธ๊ตฌ ์๋ฅผ ํฉํ๊ฒ ๋๊ธฐ ๋๋ฌธ์ dp[ํด๋น๋ ธ๋][0] += (ํด๋น ๋ ธ๋์ ์ธ๊ตฌ ์)๋ฅผ ํ๋ค. ์ดํ ์ฐ๊ฒฐ๋ ๋ ธ๋๋ค(์์ ๋ ธ๋)๋ฅผ ๋๋ฉด์ ์๋์ ์ ํ์์ ๋ง์กฑํ๋๋ก dp๋ฅผ ์ฑ์๋๊ฐ๋ค.
dp[ํ์ฌ ๋ ธ๋][0] += dp[์์ ๋ ธ๋][1] (ํ์ฌ ๋ ธ๋๋ฅผ ์ ํ O, ์์ ๋ ธ๋๋ ์ ํX)
dp[ํ์ฌ ๋ ธ๋][1] += Math.max(dp[์์ ๋ ธ๋][0], dp[์์ ๋ ธ๋][1]) (ํ์ฌ ๋ ธ๋๋ฅผ ์ ํํ์ง ์์๋ค๋ฉด ์์ ๋ ธ๋ ์ค์์ ๋ ํฐ ๊ฐ๋ง ์ ํ)
import java.util.*;
import java.io.*;
public class Main {
static List<List<Integer>> tree;
static int[] population;
static int[][] dp;
static void dfs(int cur, boolean[] visited) {
dp[cur][0] += population[cur];
visited[cur] = true;
for (int child : tree.get(cur)) {
if (visited[child] == true) continue;
dfs(child, visited);
dp[cur][0] += dp[child][1];
dp[cur][1] += Math.max(dp[child][0], dp[child][1]);
}
visited[cur] = false;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
population = new int[N];
for (int i = 0; i < N; i++) {
population[i] = Integer.parseInt(st.nextToken());
}
tree = new ArrayList<>();
for (int i = 0; i < N; i++) {
tree.add(new ArrayList<>());
}
int a;
int b;
for (int i = 0; i < N-1; i++) {
st = new StringTokenizer(br.readLine());
a = Integer.parseInt(st.nextToken());
b = Integer.parseInt(st.nextToken());
tree.get(a-1).add(b-1);
tree.get(b-1).add(a-1);
}
dp = new int[N][2];
boolean[] visited = new boolean[N];
dfs(0, visited);
System.out.println(Math.max(dp[0][0], dp[0][1]));
}
}