package Week4;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
/*题目描述
某大学有 n 个职员,编号为 1…n。
他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。
现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数 ri
,但是呢,如果某个职员的直接上司来参加舞会了,那么这个职员就无论如何也不肯来参加舞会了。
所以,请你编程计算,邀请哪些职员可以使快乐指数最大,求最大的快乐指数。
输入格式
输入的第一行是一个整数 n。
第 2 到第 (n+1) 行,每行一个整数,第 (i+1) 行的整数表示 i 号职员的快乐指数ri。
第(n+2) 到第 2n 行,每行输入一对整数 l, k,代表 k 是 l 的直接上司。
输出格式
输出一行一个整数代表最大的快乐指数。*/
//dp[x][0]+=max(dp[son][1],dp[son][0]); // 如果x不去,则快乐值为+儿子去或者不去的最大值
//dp[x][1]+=dp[son][0]; // 如果x去,则快乐值为+儿子不去的最大值
public class P1352 {
static int N;
static int dp[][];
static int arr[][];
static int happy[];
static List<Integer> list[];
static int inDegree[];
public static void main(String[] args) throws Exception {
System.setIn(new FileInputStream("Solution.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
dp = new int[N+1][2];
happy = new int[N+1];
list = new List[N+1];
inDegree = new int[N+1];
for (int i = 1; i <= N; i++) {
happy[i]=Integer.parseInt(br.readLine());
list[i]=new ArrayList<Integer>();
}
for (int i = 1; i <= N-1; i++) {
st = new StringTokenizer(br.readLine());
int s = Integer.valueOf(st.nextToken());
int e = Integer.valueOf(st.nextToken());
list[e].add(s);
inDegree[s]++;
}
int root=0;
for (int i = 1; i <= N; i++) {
if(inDegree[i]==0) {//找到跟节点,即入度为0的点就是跟节点
root=i;
break;
}
}
dfs(root);
System.out.println(Math.max(dp[root][0], dp[root][1]));
}
private static void dfs(int curr) {
for (int i = 0; i < list[curr].size(); i++) {
int son = list[curr].get(i);//当前点找儿子节点,一直找一直找到底
dfs(son);
dp[curr][1]+=dp[son][0];// 如果x去,则快乐值为+儿子不去的最大值
dp[curr][0]+=Math.max(dp[son][0], dp[son][1]);// 如果x不去,则快乐值为+儿子去或者不去的最大值
}
dp[curr][1]+=happy[curr];//回溯时负值当前节点去的时候开心值
}
}