【树形DP】 HDU 1520 Anniversary party

通道:http://acm.hdu.edu.cn/showproblem.php?pid=1520

题意:一棵树每个节点有一个权值,保证父亲节点与孩子节点不能同时出现,求出现的节点最大权值

思路:dp[u][0]:不选该节点,dp[u][1]选该节点

  1 import java.io.*;
  2 import java.util.*;
  3 
  4 public class Main {
  5     
  6     final static int MAX_N = 100010;
  7     //final static int MAX_M = 200007;
  8     final static long INF = (long)1e16;
  9     
 10     class Edge {
 11         int u, v, nxt;
 12         Edge () {
 13             
 14         }
 15         Edge (int _u, int _v, int _n) {
 16             u = _u;
 17             v = _v;
 18             nxt = _n;
 19         }
 20     }
 21     
 22     int edgecnt;
 23     int dp[][] = new int[MAX_N][2];
 24     Edge E[] = new Edge[MAX_N * 2];
 25     int head[] = new int[MAX_N];
 26     int sta[] = new int[MAX_N * 2];
 27     boolean vis[] = new boolean[MAX_N];
 28     
 29     void add(int u, int v) {
 30         E[edgecnt] = new Edge(u, v, head[u]);
 31         head[u] = edgecnt++;
 32     }
 33     
 34     void dfs(int x, int fa) {
 35         Arrays.fill(vis, false);
 36         int top = 0;
 37         vis[x] = true;
 38         sta[top++] = x;
 39         while (top > 0) {
 40             int u = sta[top - 1];
 41             boolean Ed = false;
 42             for (int i = head[u]; i + 1 != 0; i = E[i].nxt) {
 43                 int v = E[i].v;
 44                 if (vis[v]) continue;
 45                 Ed = true;
 46                 sta[top++] = v;
 47                 vis[v] = true;
 48             }
 49             if (Ed) continue;
 50             --top;
 51             for (int i = head[u]; i + 1 != 0; i = E[i].nxt) {
 52                 int v = E[i].v;
 53                 dp[v][0] += Math.max(dp[u][0], dp[u][1]);
 54                 dp[v][1] += dp[u][0];
 55                 
 56             }
 57         }
 58     }
 59     
 60     void run() throws IOException {
 61         while (cin.hasNext()) {
 62             int n = cin.nextInt();
 63             for (int i = 0; i < MAX_N; ++i)
 64                 Arrays.fill(dp[i], 0);
 65             for (int i = 1; i <= n; ++i) 
 66                 dp[i][1] = cin.nextInt();
 67             Arrays.fill(head, -1);
 68             edgecnt = 0;
 69             while (true) {
 70                 int u = cin.nextInt();
 71                 int v = cin.nextInt();
 72                 if (u == 0 && v == 0) break;
 73                 add(u, v);
 74                 add(v, u);
 75             }
 76             dfs(1, -1);
 77             int ans = Math.max(dp[1][0], dp[1][1]);
 78             out.println(ans);
 79         }
 80         out.close(); 
 81     }
 82 
 83     public static void main(String[] args) throws IOException {
 84         new Main().run();
 85     }
 86 
 87     Main() {
 88         // cin = new InputReader(System.in);
 89         cin = new Scanner(System.in);
 90         out = new PrintWriter(System.out);
 91     }
 92 
 93     PrintWriter out;
 94     //InputReader cin;
 95     Scanner cin;
 96 
 97     class InputReader {
 98         InputReader(InputStream in) {
 99             reader = new BufferedReader(new InputStreamReader(in));
100             // try {
101             // reader = new BufferedReader(new FileReader("input.txt"));
102             // } catch (FileNotFoundException ex) {
103             // }
104             tokenizer = new StringTokenizer("");
105         }
106 
107         private String next() throws IOException {
108             while (!tokenizer.hasMoreTokens()) {
109                 tokenizer = new StringTokenizer(reader.readLine());
110             }
111             return tokenizer.nextToken();
112         }
113 
114         public Integer nextInt() throws IOException {
115             return Integer.parseInt(next());
116         }
117         private BufferedReader reader;
118         private StringTokenizer tokenizer;
119     }
120 }
View Code

 

posted @ 2014-11-03 19:23  mithrilhan  阅读(145)  评论(0编辑  收藏  举报