image.png

    1. import java.util.*;
    2. public class Test{
    3. static int n;
    4. static final int maxn = 6005;
    5. static int cnt = 0;
    6. //edges[i][0] 相当于 edges[i].to
    7. //edges[i][1] 相当于 edges[i].next
    8. static int[][] edges = new int[maxn][2];
    9. static int[] head = new int[maxn];
    10. static boolean[] is_head = new boolean[maxn];
    11. static boolean[] visited = new boolean[maxn];
    12. static int[][] dp = new int[maxn][2];
    13. static void dfs(int k){
    14. visited[k] = true;
    15. for(int i = head[k]; i != -1; i = edges[i][1]){
    16. if(visited[edges[i][0]]){
    17. continue;
    18. }
    19. dfs(edges[i][0]);
    20. dp[k][1] += dp[edges[i][0]][0];
    21. dp[k][0] += Math.max(dp[edges[i][0]][0], dp[edges[i][0]][1]);
    22. }
    23. }
    24. static void add_edge(int u, int v){
    25. cnt++;
    26. edges[cnt][0] = v;
    27. edges[cnt][1] = head[u];
    28. head[u] = cnt;
    29. }
    30. public static void main(String[] args) {
    31. Scanner sc = new Scanner(System.in);
    32. n = sc.nextInt();
    33. for(int i = 1; i <= n; i++){
    34. dp[i][1] = sc.nextInt();
    35. }
    36. //初始化head[]
    37. Arrays.fill(head, -1);
    38. int k, l;
    39. for(int i = 0; i < n - 1; i++){
    40. l = sc.nextInt();
    41. k = sc.nextInt();
    42. add_edge(k, l);
    43. is_head[l] = true;
    44. }
    45. for (int i = 1; i <= n; i++){
    46. if(!is_head[i]){
    47. dfs(i);
    48. System.out.println(Math.max(dp[i][0], dp[i][1]));
    49. return;
    50. }
    51. }
    52. }
    53. }