【树形DP】 HDU 1520 Anniversary party
通道:http://acm.hdu.edu.cn/showproblem.php?pid=1520
题意:一棵树每个节点有一个权值,保证父亲节点与孩子节点不能同时出现,求出现的节点最大权值
思路:dp[u][0]:不选该节点,dp[u][1]选该节点
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }