某公司想在10月24日为每个人定制一件文化衫。文化衫有D、E、F三种款式。 D[i] 表示编号为 i 的员工收到 D 款式的文化衫时的快乐值。 E[i] 表示编号为 i 的员工收到 E 款式的文化衫时的快乐值。 F[i] 表示编号为 i 的员工收到 F 款式的文化衫时的快乐值。 没有人愿意和自己的直系领导撞衫。 求所有人收到文化衫时的快乐值总和的最大值。
输入描述: 共有 2 N 行。 第 1 行是公司的总人数 N( 2 <= N <= 5000)。 第 2 行到第 N + 1 行描述了员工的快乐值。第 i + 2 行是三个空格分隔的整数: D[i]( 0 <= D[i] <= 100)、 E[i]( 0 <= E[i] <= 100)、 F[i]( 0 <= F[i] <= 100) 表示编号为 i 的员工收到文化衫时的快乐值。最大的领导的编号为 0。 第 N + 2 行到第 2 N 行描述了公司的上下级关系。每行有两个空格分隔的整数:A 和 B,表示 A 是 B 直系领导。除大领导之外,每个员工有且只有一个直系领导。
输出描述: 一个整数,快乐值总和的最大值
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
const int N = 5050;
int n, root;
int h[N], e[N], ne[N], idx;
int happy[N][3];
int f[N][3]
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][0] = happy[u][0];
f[u][1] = happy[u][1];
f[u][2] = happy[u][2];
for(int i = h[u]; ~i; i = ne[i])
{
int j = e[i];
dfs(j);
f[u][0] += max(f[j][1], f[j][2]);
f[u][1] += max(f[j][0], f[j][2]);
f[u][2] += max(f[j][0], f[j][1]);
}
}
int main()
{
scanf("%d", &n);
// 1. 统计快乐值
for(int i = 1; i <= n; i++)
{
scanf("%d%d%d", &f[i][0], &f[i][1], &f[i][2]);
}
for(int i = 1; i < n; i++)
{
int a, b;
scanf("%d%d", &a, &b);
add(a, b);
has_father[b] = true;
}
// 2. 找到root
for(int i = 1; i <= n; i++)
if(!has_father[i])
{
root = i;
break;
}
dfs(root);
cout << max(max(f[root][1], f[root][1]), f[root][2]) << endl;
return 0;
}