链接
状态表示
状态计算:f是s字节的子结点
- 选:f[u][0] += max(f[j][0], f[j][1])
- 不选:f[u][1] += f[j][1]
#include#include #include const int N = 6010; using namespace std; int n; int happy[N];//每个人的高兴度 int h[N], e[N], ne[N], idx; int f[N][2]; bool has_father[N]; //父节点、 void add (int a, int b) { e[idx] = b,ne[idx] = h[a],h[a] = idx ++; } void dfs(int u) { f[u][1] = happy[u]; // 如果选了 for(int i = h[u]; i != -1; i = ne[i]) { int j = e[i]; dfs(j); f[u][0] += max(f[j][0], f[j][1]); f[u][1] += f[j][0]; } } int main () { scanf("%d", &n); for(int i = 1; i <= n; i ++) { scanf ("%d", &happy[i]); } memset(h, -1, sizeof h); for(int i = 0; i < n - 1; i ++) { int a,b; scanf("%d%d", &a, &b); has_father[a] = true; add(b,a); } int root = 1; while(has_father[root]) { root ++; } dfs(root); printf("%dn", max(f[root][0], f[root][1])); return 0; }



